{
    "$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]+$"
        }
    }
}
