289 lines
8.8 KiB
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" }
|
|
}
|
|
}
|
|
}
|
|
}
|