{
    "$id": "machine-config-schema.json",
    "$schema": "http://json-schema.org/draft-07/schema#",
    "description": "Cartesi Machine Configuration",
    "type": "object",
    "$ref": "#/definitions/machineConfig",
    "definitions": {
      "machineConfig" : {
          "title": "machineConfig",
        "type" : "object",
        "properties" : {
            "processor": {
                "$ref": "#/definitions/processor"
            },
            "ram": {
                "$ref": "#/definitions/ram"
            },
            "rom": {
                "$ref": "#/definitions/rom"
            },
            "htif": {
                "$ref": "#/definitions/htif"
            },
            "clint": {
                "$ref": "#/definitions/clint"
            },
            "flash_drive": {
               "$ref": "#/definitions/flash_drive"
            }
        },
        "required": ["ram", "rom", "flash_drive"],
        "additionalProperties": false
      },
      "processor": {
          "type": "object",
          "title": "processor",
          "properties": {
              "x" : {
                  "$ref": "#/definitions/x"
              },
              "iflags": {
                  "$ref": "#/definitions/HexNumber"
              },
              "ilrsc": {
                  "$ref": "#/definitions/HexNumber"
              },
              "marchid": {
                  "$ref": "#/definitions/HexNumber"
              },
              "mcause": {
                  "$ref": "#/definitions/HexNumber"
              },
              "mcounteren": {
                  "$ref": "#/definitions/HexNumber"
              },
              "mcycle": {
                  "$ref": "#/definitions/HexNumber"
              },
              "medeleg": {
                  "$ref": "#/definitions/HexNumber"
              },
              "mepc": {
                  "$ref": "#/definitions/HexNumber"
              },
              "mideleg": {
                  "$ref": "#/definitions/HexNumber"
              },
              "mie": {
                  "$ref": "#/definitions/HexNumber"
              },
              "mimpid": {
                  "$ref": "#/definitions/HexNumber"
              },
              "minstret" : {
                  "$ref": "#/definitions/HexNumber"
              },
              "mip": {
                  "$ref": "#/definitions/HexNumber"
              },
              "misa": {
                  "$ref": "#/definitions/HexNumber"
              },
              "mscratch": {
                  "$ref": "#/definitions/HexNumber"
              },
              "mstatus": {
                  "$ref": "#/definitions/HexNumber"
              },
              "mtval": {
                  "$ref": "#/definitions/HexNumber"
              },
              "mtvec": {
                  "$ref": "#/definitions/HexNumber"
              },
              "mvendorid": {
                  "$ref": "#/definitions/HexNumber"
              },
              "pc": {
                  "$ref": "#/definitions/HexNumber"
              },
              "satp": {
                  "$ref": "#/definitions/HexNumber"
              },
              "scause": {
                  "$ref": "#/definitions/HexNumber"
              },
              "scounteren": {
                  "$ref": "#/definitions/HexNumber"
              },
              "sepc": {
                  "$ref": "#/definitions/HexNumber"
              },
              "sscratch": {
                  "$ref": "#/definitions/HexNumber"
              },
              "stval": {
                  "$ref": "#/definitions/HexNumber"
              },
              "stvec": {
                  "$ref": "#/definitions/HexNumber"
              }
          },
          "required": [],
          "additionalProperties": false
      },
      "ram": {
          "title": "ram",
          "type": "object",
          "properties": {
              "length": {
                  "$ref" : "#/definitions/HexNumber"
              },
              "image_filename": {
                  "type": "string"
              }
          },
          "required": ["length", "image_filename"],
          "additionalProperties": false
      },
      "rom": {
          "type": "object",
        "title": "rom",
        "properties": {
            "image_filename": {
                "type":"string"
            },
            "bootargs": {
                "type": "string"
            }
        },
          "required": ["image_filename", "bootargs"],
          "additionalProperties": false
      },
      "htif": {
          "type": "object",
          "title":"htif",
          "properties": {
              "tohost": {
                  "$ref": "#/definitions/HexNumber"
              },
              "fromhost": {
                  "$ref": "#/definitions/HexNumber"
              },
              "console_getchar":{
                  "type": "boolean"
              },
              "yield_progress":{
                  "type": "boolean"
              },
              "yield_rollup":{
                  "type": "boolean"
              }
          },
          "required": ["tohost","fromhost","console_getchar", "yield_progress", "yield_rollup"],
          "additionalProperties": false
      },
      "clint":{
          "type": "object",
          "title": "clint",
          "properties" :{
              "mtimecmp" : {
                  "$ref": "#/definitions/HexNumber"
              }
          },
          "required": ["mtimecmp"],
          "additionalProperties": false
      },
      "flash_drive": {
          "title": "flash_drive",
          "type": "array",
          "items": {
              "$ref": "#/definitions/Drive"
          }
      },
      "Drive": {
        "type": "object",
        "title":"drive",
        "properties": {
            "start": {
                "$ref": "#/definitions/HexNumber"
            },
            "length": {
                "$ref": "#/definitions/HexNumber"
            },
            "image_filename": {
                "type": "string"
            },
            "shared": {
                "type": "boolean"
            }
        },
        "required": ["start","length","shared"],
        "additionalProperties": false
      },
      "x": {
          "title": "x",
          "type":"array",
          "items":{
              "$ref": "#/definitions/HexNumber"
          }
      },
      "HexNumber": {
          "type":"string",
          "pattern": "^0x[a-fA-F\\d]+$"
      }
    }
}