schemeta/frontend/schemeta.schema.json

289 lines
8.8 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://schemeta.dev/schema/schemeta.schema.json",
"title": "Schemeta JSON Model (SJM)",
"type": "object",
"additionalProperties": false,
"required": ["meta", "symbols", "instances", "nets", "constraints", "annotations"],
"properties": {
"meta": {
"type": "object",
"description": "Project metadata.",
"additionalProperties": true
},
"symbols": {
"type": "object",
"description": "Map of symbol_id -> symbol definition.",
"patternProperties": {
"^[A-Za-z_][A-Za-z0-9_]*$": {
"$ref": "#/$defs/symbol"
}
},
"additionalProperties": false
},
"instances": {
"type": "array",
"items": { "$ref": "#/$defs/instance" }
},
"nets": {
"type": "array",
"items": { "$ref": "#/$defs/net" }
},
"constraints": { "$ref": "#/$defs/constraints" },
"annotations": {
"type": "array",
"items": { "$ref": "#/$defs/annotation" }
}
},
"$defs": {
"pinType": {
"type": "string",
"enum": ["power_in", "power_out", "input", "output", "bidirectional", "passive", "analog", "ground"]
},
"pinSide": {
"type": "string",
"enum": ["left", "right", "top", "bottom"]
},
"netClass": {
"type": "string",
"enum": ["power", "ground", "signal", "analog", "differential", "clock", "bus"]
},
"pin": {
"type": "object",
"additionalProperties": false,
"required": ["name", "number", "side", "offset", "type"],
"properties": {
"name": { "type": "string", "minLength": 1 },
"number": { "type": "string", "minLength": 1 },
"side": { "$ref": "#/$defs/pinSide" },
"offset": { "type": "number", "minimum": 0 },
"type": { "$ref": "#/$defs/pinType" }
}
},
"symbol": {
"type": "object",
"additionalProperties": true,
"description": "Symbol definition. Minimal shorthand is supported for template/generic symbols; compiler hydrates missing fields.",
"required": [],
"properties": {
"symbol_id": {
"type": "string",
"minLength": 1,
"description": "Optional in shorthand; defaults to map key."
},
"category": {
"type": "string",
"minLength": 1,
"description": "Optional in shorthand; inferred from template or defaults to generic."
},
"auto_generated": { "type": "boolean" },
"template_name": {
"type": "string",
"enum": ["resistor", "capacitor", "inductor", "diode", "led", "connector"]
},
"body": {
"type": "object",
"additionalProperties": false,
"required": ["width", "height"],
"properties": {
"width": { "type": "number", "minimum": 20 },
"height": { "type": "number", "minimum": 20 }
}
},
"pins": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/$defs/pin" }
},
"graphics": {
"type": "object",
"additionalProperties": true,
"properties": {
"primitives": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true,
"required": ["type"],
"properties": {
"type": { "type": "string" }
}
}
}
}
}
},
"examples": [
{ "template_name": "resistor" },
{ "category": "generic" },
{
"symbol_id": "opamp_generic",
"category": "analog",
"body": { "width": 160, "height": 120 },
"pins": [
{ "name": "IN+", "number": "1", "side": "left", "offset": 24, "type": "analog" },
{ "name": "IN-", "number": "2", "side": "left", "offset": 48, "type": "analog" },
{ "name": "OUT", "number": "3", "side": "right", "offset": 36, "type": "output" }
]
}
]
},
"placement": {
"type": "object",
"additionalProperties": false,
"required": ["x", "y", "rotation", "locked"],
"properties": {
"x": { "type": ["number", "null"] },
"y": { "type": ["number", "null"] },
"rotation": { "type": "number" },
"locked": { "type": "boolean" }
}
},
"instance": {
"type": "object",
"additionalProperties": false,
"required": ["ref", "properties", "placement"],
"anyOf": [{ "required": ["symbol"] }, { "required": ["part"] }],
"properties": {
"ref": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_]*$" },
"symbol": {
"type": "string",
"minLength": 1,
"description": "Custom symbol id reference."
},
"part": {
"type": "string",
"description": "Built-in shorthand for common parts (no explicit symbol definition required).",
"enum": ["resistor", "capacitor", "inductor", "diode", "led", "connector", "generic"]
},
"properties": {
"type": "object",
"description": "Instance-level editable properties. Includes UI/editor hints such as per-pin label visibility.",
"properties": {
"pin_ui": {
"type": "object",
"description": "Per-pin UI overrides keyed by pin name.",
"additionalProperties": {
"type": "object",
"additionalProperties": false,
"properties": {
"show_net_label": { "type": "boolean" }
}
}
}
},
"additionalProperties": {
"type": ["string", "number", "boolean", "null", "object", "array"]
}
},
"placement": { "$ref": "#/$defs/placement" }
},
"examples": [
{
"ref": "R1",
"part": "resistor",
"properties": { "value": "10k", "pin_ui": { "1": { "show_net_label": true } } },
"placement": { "x": null, "y": null, "rotation": 0, "locked": false }
},
{
"ref": "U1",
"symbol": "esp32_s3_supermini",
"properties": { "value": "ESP32-S3" },
"placement": { "x": null, "y": null, "rotation": 0, "locked": false }
}
]
},
"netNode": {
"type": "object",
"additionalProperties": false,
"required": ["ref", "pin"],
"properties": {
"ref": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_]*$" },
"pin": { "type": "string", "minLength": 1 }
}
},
"net": {
"type": "object",
"additionalProperties": false,
"required": ["name", "class", "nodes"],
"properties": {
"name": { "type": "string", "minLength": 1 },
"class": { "$ref": "#/$defs/netClass" },
"nodes": {
"type": "array",
"minItems": 2,
"items": { "$ref": "#/$defs/netNode" }
}
}
},
"constraintGroup": {
"type": "object",
"additionalProperties": false,
"required": ["name", "members", "layout"],
"properties": {
"name": { "type": "string" },
"members": {
"type": "array",
"items": { "type": "string" }
},
"layout": { "type": "string", "enum": ["cluster"] }
}
},
"alignmentConstraint": {
"type": "object",
"additionalProperties": false,
"required": ["left_of", "right_of"],
"properties": {
"left_of": { "type": "string" },
"right_of": { "type": "string" }
}
},
"nearConstraint": {
"type": "object",
"additionalProperties": false,
"required": ["component", "target_pin"],
"properties": {
"component": { "type": "string" },
"target_pin": {
"type": "object",
"additionalProperties": false,
"required": ["ref", "pin"],
"properties": {
"ref": { "type": "string" },
"pin": { "type": "string" }
}
}
}
},
"constraints": {
"type": "object",
"additionalProperties": false,
"properties": {
"groups": {
"type": "array",
"items": { "$ref": "#/$defs/constraintGroup" }
},
"alignment": {
"type": "array",
"items": { "$ref": "#/$defs/alignmentConstraint" }
},
"near": {
"type": "array",
"items": { "$ref": "#/$defs/nearConstraint" }
}
},
"default": {}
},
"annotation": {
"type": "object",
"additionalProperties": false,
"required": ["text"],
"properties": {
"text": { "type": "string", "minLength": 1 },
"x": { "type": "number" },
"y": { "type": "number" }
}
}
}
}