{
    "$id": "machine-config-package-schema.json",
    "$schema": "http://json-schema.org/draft-07/schema#",
    "description": "Cartesi Machine Package Description",
    "type": "object",
    "$ref": "#/definitions/package",
    "definitions": {
        "package": {
            "type": "object",
            "title": "cartiPackage",
            "properties": {
                "machineConfig": {
                    "$ref": "#/definitions/packageMachineConfig"
                },
                "assets": {
                    "$ref": "#/definitions/assets"
                },
                "version": {
                    "$ref": "#/definitions/version"
                },
                "metadata": {
                    "$ref": "#/definitions/metadata"
                },
                "repos": {
                    "$ref": "#/definitions/repos",
                    "$comment": "current restriction that repo must be git(hub/lab/etc...) based"
                }
            },
            "required": [
                "machineConfig",
                "assets",
                "version"
            ]
        },
        "version": {
            "title": "version"
        },
        "metadata": {
            "type": "object",
            "title": "metadata",
            "properties": {
                "projectName": {
                    "title": "projectName",
                    "type": "string"
                }
            }
        },
        "assets": {
            "type": "array",
            "title": "assets",
            "items": {
                "$ref": "#/definitions/asset"
            }
        },
        "asset": {
            "type": "object",
            "title": "asset",
            "properties": {
                "name": {
                    "title": "name",
                    "type": "string"
                },
                "fileName": {
                    "title": "fileName",
                    "type": "string"
                },
                "cid": {
                    "title": "cid",
                    "type": "string"
                }
            },
            "required": [
                "name",
                "fileName",
                "cid"
            ]
        },
        "packageMachineConfig": {
            "title": "packageMachineConfig",
            "type": "object",
            "properties": {
                "processor": {
                    "$ref": "#/definitions/processor"
                },
                "boot": {
                    "$ref": "#/definitions/boot"
                },
                "ram": {
                    "$ref": "#/definitions/ram"
                },
                "rom": {
                    "$ref": "#/definitions/rom"
                },
                "htif": {
                    "$ref": "#/definitions/htif"
                },
                "clint": {
                    "$ref": "#/definitions/clint"
                },
                "flash_drive": {
                    "$ref": "#/definitions/flash_drive"
                }
            },
            "required": [
                "boot",
                "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"
                },
                "cid": {
                    "type": "string"
                },
                "resolvedPath": {
                    "type": "string"
                }
            },
            "required": [
                "length",
                "cid"
            ],
            "additionalProperties": false
        },
        "boot": {
            "type": "object",
            "title": "boot",
            "properties": {
                "args": {
                    "$ref": "#/definitions/args"
                },
                "bootPrefix": {
                    "$ref": "#/definitions/bootPrefix"
                }
            },
            "required": ["args"],
            "additionalProperties": false
        },
        "repo": {
            "title": "repo",
            "type": "string"
        },
        "repos": {
            "title": "repos",
            "type": "array",
            "items": {
                "$ref": "#/definitions/repo"
            }
        },
        "rom": {
            "type": "object",
            "title": "rom",
            "properties": {
                "cid": {
                    "type": "string"
                },
                "resolvedPath": {
                    "type": "string"
                }
            },
            "required": ["cid"],
            "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"
                },
                "cid": {
                    "type": "string"
                },
                "resolvedPath": {
                    "type": "string"
                },
                "shared": {
                    "type": "boolean"
                },
                "label": {
                    "type": "string"
                }
            },
            "required": [
                "start",
                "length",
                "shared",
                "label"
            ],
            "additionalProperties": false
        },
        "x": {
            "title": "x",
            "type": "array",
            "items": {
                "$ref": "#/definitions/HexNumber"
            }
        },
        "HexNumber": {
            "type": "string",
            "pattern": "^0x[a-fA-F\\d]+$"
        },
        "args": {
            "title": "args",
            "type": "string"
        },
        "bootPrefix": {
            "title": "bootPrefix",
            "type": "string"
        }
    }
}
