{
  "schema": "lemonergy/studio-help-catalog@1",
  "sourceRepository": "battery-design",
  "sourceRevision": "e248d21a9902225f1075624f23e7628b54cdb7cc",
  "hashEncoding": "UTF-8 text with CRLF normalized to LF",
  "sourceFiles": {
    "js/cosim-graph.js": "2eabf53b0d96d098547db5ace5ce969485497051e0fb844af6b5ecc38a72a649",
    "js/native-blocks.js": "245e60b39598e3b4324d8d20dc7f2f4d89082d8bc074d44c73be2c5e819ac496",
    "js/studio-model.js": "de5fddd149932d5bb758fa589959abbc860d120a672e1b86c0d348994b476a1a",
    "js/studio-feature-catalog.js": "5f01129d90ee2a50d671a5d93ee386b49f2a952824403c71976467d3cbc96337",
    "js/signal-help.js": "bbe10e0bf68fd3f682f09e98bbeafa9d5cafa70e60d20201e8097544fcc02e2d",
    "js/physical-network.js": "b980498479b1e8fa0d96f7d620bbd674839e67d63e804215ba1972a1c5ef4f85",
    "js/physical-battery-coupling.js": "fb64fe0e0cab51758dcbffe2f3f9625eb6ba09f6429394864ce5ac227f07c3e2",
    "js/physical-mechanics.js": "5e4f0be0e1bccf82c8d601d5272e1b4583ee5259e5db4975b15e1aa477f6f97f",
    "js/physical-foundation.js": "68611cfa351cc764a52b7af737f2f25601e6746e1a03d28d4fc2bcf104859515",
    "js/physical-electrical.js": "26b70e897c5bb3ec57d2fd6dbb2c699cdf32cb95fca8305cdc18c86b13b8a1fe",
    "js/charging-control.js": "cbbde44fcdc3f7e7db7d2c11819f51e5e00c9ec10832f5b36f433ca4128d8592",
    "js/physical-help-content.js": "70af6d12441f5a72f30fad892b8a4a25545e1d78de0fc26acd54626918873ed9"
  },
  "scope": "Public authoring metadata and semantic help scenes exported from Studio. Diagrams explain interfaces and operation; they are not simulated or measured output. Source file hashes identify the working source independently of the base revision.",
  "entries": [
    {
      "type": "ac-current-source",
      "namespace": "physical",
      "slug": "ac-current-source",
      "canonicalSlug": "ac-current-source",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "ac-current-source",
        "name": "AC current source",
        "domain": "electrical",
        "family": "current-source",
        "operation": "Imposes a sinusoidal current plus bias, positive from p to n.",
        "mechanism": [
          "Amplitude, phase and frequency",
          "Sinusoidal current"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "current-source",
            "label": "Controlled current source"
          },
          {
            "type": "inductor",
            "label": "Inductor"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 32
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H68M132 40H190M80 40H120L110 30M120 40L110 50"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "amplitudeA",
            "default": 1,
            "unit": "A peak",
            "min": 0,
            "max": 1000000,
            "value": 1
          },
          {
            "id": "frequencyHz",
            "default": 1,
            "unit": "Hz",
            "min": 0,
            "max": 1000000,
            "value": 1
          },
          {
            "id": "phaseRad",
            "default": 0,
            "unit": "rad",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          },
          {
            "id": "biasA",
            "default": 0,
            "unit": "A",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "ac-voltage-source",
      "namespace": "physical",
      "slug": "ac-voltage-source",
      "canonicalSlug": "ac-voltage-source",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "ac-voltage-source",
        "name": "AC voltage source",
        "domain": "electrical",
        "family": "voltage-source",
        "operation": "Imposes a sinusoidal voltage p minus n plus bias.",
        "mechanism": [
          "Amplitude, phase and frequency",
          "Sinusoidal voltage"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "voltage-source",
            "label": "Controlled voltage source"
          },
          {
            "type": "capacitor",
            "label": "Capacitor"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 32
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H68M132 40H190M100 15V31M92 23H108M92 57H108"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "amplitudeV",
            "default": 1,
            "unit": "V peak",
            "min": 0,
            "max": 1000000,
            "value": 1
          },
          {
            "id": "frequencyHz",
            "default": 1,
            "unit": "Hz",
            "min": 0,
            "max": 1000000,
            "value": 1
          },
          {
            "id": "phaseRad",
            "default": 0,
            "unit": "rad",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          },
          {
            "id": "biasV",
            "default": 0,
            "unit": "V",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "active-supervision-interface",
      "namespace": "physical",
      "slug": "active-supervision-interface",
      "canonicalSlug": "active-supervision-interface",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "active-supervision-interface",
        "name": "Active cell supervision interface",
        "domain": "electrical",
        "family": "controller-power",
        "operation": "Uses a discharge-current sink or finite-resistance charging, depending on the commanded charge voltage and terminal voltage.",
        "mechanism": [
          "Discharge or charge command",
          "Simulated cell interface",
          "Terminal measurements"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "passive-supervision-interface",
            "label": "Passive cell supervision interface"
          },
          {
            "type": "battery-ocv",
            "label": "Battery with SOC-dependent OCV"
          }
        ],
        "symbol": [
          {
            "tag": "rect",
            "attrs": {
              "x": 60,
              "y": 10,
              "width": 80,
              "height": 60,
              "rx": 3
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H60M140 40H190M80 55V25H95M105 55V25H120"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "discharge",
            "label": "Discharge current",
            "quantity": "current",
            "unit": "A",
            "active": true,
            "summary": "Discharge current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "chargeVoltage",
            "label": "Charging voltage",
            "quantity": "voltage",
            "unit": "V",
            "active": true,
            "summary": "Charging voltage is a directed voltage input to this component, expressed in V. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "dischargeCurrentA",
            "default": 0,
            "unit": "A",
            "min": 0,
            "max": 1000000,
            "value": 0
          },
          {
            "id": "chargeVoltageV",
            "default": 0,
            "unit": "V",
            "min": 0,
            "max": 1000000,
            "value": 0
          },
          {
            "id": "chargeResistanceOhm",
            "default": 0.1,
            "unit": "ohm",
            "min": 0.000001,
            "max": 1000000000,
            "value": 0.1
          }
        ]
      }
    },
    {
      "type": "balancing-interface",
      "namespace": "physical",
      "slug": "balancing-interface",
      "canonicalSlug": "balancing-interface",
      "existing": true,
      "dynamic": true,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "balancing-interface",
        "name": "Multi-cell balancing interface",
        "domain": "electrical",
        "family": "balancing",
        "operation": "Draws independently commanded nonnegative currents from one to eight cell circuits and reports each circuit’s voltage and power.",
        "mechanism": [
          "Per-cell commands",
          "Independent current sinks",
          "Per-cell measurements"
        ],
        "ports": [
          {
            "id": "p1",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 1 positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n1",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 1 negative terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "p2",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 2 positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n2",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 2 negative terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "p3",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 3 positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n3",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 3 negative terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "p4",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 4 positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n4",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 4 negative terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "p5",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 5 positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n5",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 5 negative terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "p6",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 6 positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n6",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 6 negative terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "p7",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 7 positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n7",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 7 negative terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "p8",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 8 positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n8",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Circuit 8 negative terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "passive-supervision-interface",
            "label": "Passive cell supervision interface"
          },
          {
            "type": "battery-ocv",
            "label": "Battery with SOC-dependent OCV"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 15H70L85 5L100 25L115 5L130 15H190M10 40H70L85 30L100 50L115 30L130 40H190M10 65H70L85 55L100 75L115 55L130 65H190"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "current1",
            "label": "Circuit 1 current",
            "quantity": "current",
            "unit": "A",
            "active": true,
            "summary": "Circuit 1 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "current2",
            "label": "Circuit 2 current",
            "quantity": "current",
            "unit": "A",
            "active": true,
            "summary": "Circuit 2 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "current3",
            "label": "Circuit 3 current",
            "quantity": "current",
            "unit": "A",
            "active": true,
            "summary": "Circuit 3 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "current4",
            "label": "Circuit 4 current",
            "quantity": "current",
            "unit": "A",
            "active": true,
            "summary": "Circuit 4 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "current5",
            "label": "Circuit 5 current",
            "quantity": "current",
            "unit": "A",
            "active": true,
            "summary": "Circuit 5 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "current6",
            "label": "Circuit 6 current",
            "quantity": "current",
            "unit": "A",
            "active": true,
            "summary": "Circuit 6 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "current7",
            "label": "Circuit 7 current",
            "quantity": "current",
            "unit": "A",
            "active": true,
            "summary": "Circuit 7 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "current8",
            "label": "Circuit 8 current",
            "quantity": "current",
            "unit": "A",
            "active": true,
            "summary": "Circuit 8 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "voltage1",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage1",
            "unit": "V"
          },
          {
            "id": "current1",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current1",
            "unit": "A"
          },
          {
            "id": "power1",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power1",
            "unit": "W"
          },
          {
            "id": "voltage2",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage2",
            "unit": "V"
          },
          {
            "id": "current2",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current2",
            "unit": "A"
          },
          {
            "id": "power2",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power2",
            "unit": "W"
          },
          {
            "id": "voltage3",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage3",
            "unit": "V"
          },
          {
            "id": "current3",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current3",
            "unit": "A"
          },
          {
            "id": "power3",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power3",
            "unit": "W"
          },
          {
            "id": "voltage4",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage4",
            "unit": "V"
          },
          {
            "id": "current4",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current4",
            "unit": "A"
          },
          {
            "id": "power4",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power4",
            "unit": "W"
          },
          {
            "id": "voltage5",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage5",
            "unit": "V"
          },
          {
            "id": "current5",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current5",
            "unit": "A"
          },
          {
            "id": "power5",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power5",
            "unit": "W"
          },
          {
            "id": "voltage6",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage6",
            "unit": "V"
          },
          {
            "id": "current6",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current6",
            "unit": "A"
          },
          {
            "id": "power6",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power6",
            "unit": "W"
          },
          {
            "id": "voltage7",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage7",
            "unit": "V"
          },
          {
            "id": "current7",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current7",
            "unit": "A"
          },
          {
            "id": "power7",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power7",
            "unit": "W"
          },
          {
            "id": "voltage8",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage8",
            "unit": "V"
          },
          {
            "id": "current8",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current8",
            "unit": "A"
          },
          {
            "id": "power8",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power8",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "circuits",
            "default": 1,
            "unit": "circuits",
            "min": 1,
            "max": 8,
            "value": 8
          },
          {
            "id": "defaultCurrentA",
            "default": 0,
            "unit": "A",
            "min": 0,
            "max": 1000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "battery-ocv",
      "namespace": "physical",
      "slug": "battery-ocv",
      "canonicalSlug": "battery-ocv",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "battery-ocv",
        "name": "Battery with SOC-dependent OCV",
        "domain": "electrical",
        "family": "battery",
        "operation": "Uses state of charge to set open-circuit voltage, adds series resistance, and updates charge from terminal current.",
        "mechanism": [
          "Charge state",
          "OCV and resistance",
          "Terminal voltage"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "battery-source",
            "label": "Battery: resistance and charge state"
          },
          {
            "type": "regulated-charger",
            "label": "Regulated CC/CV charger"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H60M60 10V70M80 25V55M120 10V70M140 25V55M140 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "ocv",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "ocv",
            "unit": "V"
          },
          {
            "id": "socSignal",
            "quantity": "fraction",
            "declared": true,
            "consumers": [],
            "label": "soc Signal",
            "unit": "fraction"
          },
          {
            "id": "loss",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "loss",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "emptyVoltageV",
            "default": 300,
            "unit": "V",
            "min": 0.01,
            "max": 1000000,
            "value": 300
          },
          {
            "id": "fullVoltageV",
            "default": 420,
            "unit": "V",
            "min": 0.01,
            "max": 1000000,
            "value": 420
          },
          {
            "id": "resistanceOhm",
            "default": 0.08,
            "unit": "ohm",
            "min": 0.000001,
            "max": 1000000,
            "value": 0.08
          },
          {
            "id": "capacityAh",
            "default": 100,
            "unit": "Ah",
            "min": 0.000001,
            "max": 1000000000,
            "value": 100
          },
          {
            "id": "initialSoc",
            "default": 0.2,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0.2
          },
          {
            "id": "coulombicEfficiency",
            "default": 1,
            "unit": "fraction",
            "min": 0.01,
            "max": 1,
            "value": 1
          }
        ]
      }
    },
    {
      "type": "battery-source",
      "namespace": "physical",
      "slug": "battery-source",
      "canonicalSlug": "battery-source",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "battery-source",
        "name": "Battery: resistance and charge state",
        "domain": "electrical",
        "family": "battery",
        "operation": "Combines a fixed source voltage and series resistance while counting charge into a state of charge.",
        "mechanism": [
          "Source voltage",
          "Series resistance",
          "Charge accounting"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "battery-ocv",
            "label": "Battery with SOC-dependent OCV"
          },
          {
            "type": "resistor",
            "label": "Resistor"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H60M60 10V70M80 25V55M120 10V70M140 25V55M140 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "loss",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "loss",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "voltageV",
            "default": 350,
            "unit": "V",
            "min": 0.01,
            "max": 1000000,
            "value": 350
          },
          {
            "id": "resistanceOhm",
            "default": 0.08,
            "unit": "ohm",
            "min": 1e-9,
            "max": 1000000,
            "value": 0.08
          },
          {
            "id": "capacityAh",
            "default": 100,
            "unit": "Ah",
            "min": 1e-9,
            "max": 1000000000,
            "value": 100
          },
          {
            "id": "initialSoc",
            "default": 0.8,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0.8
          }
        ]
      }
    },
    {
      "type": "bidirectional-grid",
      "namespace": "physical",
      "slug": "bidirectional-grid",
      "canonicalSlug": "bidirectional-grid",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "bidirectional-grid",
        "name": "Bidirectional grid / load interface",
        "domain": "electrical",
        "family": "controller-power",
        "operation": "Exchanges power between a battery and a grid or load with import/export efficiencies, limits and protection conditions.",
        "mechanism": [
          "Signed power request",
          "Limits and efficiency",
          "Battery power exchange"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "energy-dispatch",
            "label": "Scheduled import / export and load policy"
          },
          {
            "type": "battery-ocv",
            "label": "Battery with SOC-dependent OCV"
          }
        ],
        "symbol": [
          {
            "tag": "rect",
            "attrs": {
              "x": 60,
              "y": 10,
              "width": 80,
              "height": 60,
              "rx": 3
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H60M140 40H190M80 55V25H95M105 55V25H120"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "command",
            "label": "Signed power request",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Signed power request is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "soc",
            "label": "State of charge",
            "quantity": "fraction",
            "unit": "fraction",
            "active": true,
            "summary": "State of charge is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "connected",
            "label": "Connection status",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Connection status is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "bmsPermit",
            "label": "Battery protection permission",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Battery protection permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "temperature",
            "label": "Battery temperature",
            "quantity": "temperature",
            "unit": "K",
            "active": true,
            "summary": "Battery temperature is a directed temperature input to this component, expressed in K. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "importPrice",
            "label": "Import energy price",
            "quantity": "dimensionless",
            "unit": "currency/kWh (dimensionless signal)",
            "active": true,
            "summary": "Import energy price is a directed dimensionless input to this component, expressed in currency/kWh (dimensionless signal). Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "exportPrice",
            "label": "Export energy price",
            "quantity": "dimensionless",
            "unit": "currency/kWh (dimensionless signal)",
            "active": true,
            "summary": "Export energy price is a directed dimensionless input to this component, expressed in currency/kWh (dimensionless signal). Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "dcPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "dc Power",
            "unit": "W"
          },
          {
            "id": "gridPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "grid Power",
            "unit": "W"
          },
          {
            "id": "loss",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "loss",
            "unit": "W"
          },
          {
            "id": "allowed",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "allowed",
            "unit": "1"
          }
        ],
        "parameters": [
          {
            "id": "powerW",
            "default": 0,
            "unit": "W grid import (+), export (-)",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "importLimitW",
            "default": 7000,
            "unit": "W",
            "min": 0,
            "max": 1000000000,
            "value": 7000
          },
          {
            "id": "exportLimitW",
            "default": 7000,
            "unit": "W",
            "min": 0,
            "max": 1000000000,
            "value": 7000
          },
          {
            "id": "importCurrentA",
            "default": 32,
            "unit": "A",
            "min": 0,
            "max": 1000000,
            "value": 32
          },
          {
            "id": "exportCurrentA",
            "default": 32,
            "unit": "A",
            "min": 0,
            "max": 1000000,
            "value": 32
          },
          {
            "id": "importEfficiency",
            "default": 0.95,
            "unit": "fraction",
            "min": 0.01,
            "max": 1,
            "value": 0.95
          },
          {
            "id": "exportEfficiency",
            "default": 0.95,
            "unit": "fraction",
            "min": 0.01,
            "max": 1,
            "value": 0.95
          },
          {
            "id": "capacityAh",
            "default": 100,
            "unit": "Ah",
            "min": 0.000001,
            "max": 1000000000,
            "value": 100
          },
          {
            "id": "reserveSoc",
            "default": 0.2,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0.2
          },
          {
            "id": "targetSoc",
            "default": 0.8,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0.8
          },
          {
            "id": "minimumVoltageV",
            "default": 250,
            "unit": "V",
            "min": 0.01,
            "max": 1000000,
            "value": 250
          },
          {
            "id": "voltageLimitV",
            "default": 420,
            "unit": "V",
            "min": 0.01,
            "max": 1000000,
            "value": 420
          },
          {
            "id": "boundaryTimeS",
            "default": 1,
            "unit": "s",
            "min": 0.001,
            "max": 3600,
            "value": 1
          },
          {
            "id": "minTemperatureK",
            "default": 273.15,
            "unit": "K",
            "min": 1,
            "max": 1000,
            "value": 273.15
          },
          {
            "id": "maxTemperatureK",
            "default": 318.15,
            "unit": "K",
            "min": 1,
            "max": 1000,
            "value": 318.15
          },
          {
            "id": "importPrice",
            "default": 0.2,
            "unit": "currency/kWh",
            "min": 0,
            "max": 1000000,
            "value": 0.2
          },
          {
            "id": "exportPrice",
            "default": 0.1,
            "unit": "currency/kWh",
            "min": 0,
            "max": 1000000,
            "value": 0.1
          }
        ]
      }
    },
    {
      "type": "body-inertia",
      "namespace": "physical",
      "slug": "body-inertia",
      "canonicalSlug": "body-inertia",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "body-inertia",
        "name": "Rigid body and inertia",
        "domain": "mechanical",
        "family": "body",
        "operation": "Represents a moving rigid body with mass and principal inertias; forces and torques change its motion.",
        "mechanism": [
          "Force and torque",
          "Mass and inertia",
          "Position and orientation"
        ],
        "ports": [
          {
            "id": "frame",
            "domain": "frame",
            "kind": "conserving",
            "label": "Rigid-body frame",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "world-frame",
            "label": "World frame"
          },
          {
            "type": "force-torque",
            "label": "External force and torque"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M60 25L100 5L145 25L100 48Z M60 25V60L100 80L145 60V25M100 48V80"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "energy",
            "quantity": "energy",
            "declared": true,
            "consumers": [],
            "label": "energy",
            "unit": "J"
          },
          {
            "id": "quaternionNorm",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "quaternion Norm",
            "unit": "1"
          }
        ],
        "parameters": [
          {
            "id": "xM",
            "default": 0,
            "unit": "m",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "yM",
            "default": 0,
            "unit": "m",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "zM",
            "default": 0,
            "unit": "m",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "qw",
            "default": 1,
            "unit": "1",
            "min": -1,
            "max": 1,
            "value": 1
          },
          {
            "id": "qx",
            "default": 0,
            "unit": "1",
            "min": -1,
            "max": 1,
            "value": 0
          },
          {
            "id": "qy",
            "default": 0,
            "unit": "1",
            "min": -1,
            "max": 1,
            "value": 0
          },
          {
            "id": "qz",
            "default": 0,
            "unit": "1",
            "min": -1,
            "max": 1,
            "value": 0
          },
          {
            "id": "massKg",
            "default": 1,
            "unit": "kg",
            "min": 1e-9,
            "max": 1000000000000,
            "value": 1
          },
          {
            "id": "ixKgM2",
            "default": 1,
            "unit": "kg m2",
            "min": 1e-9,
            "max": 1000000000000,
            "value": 1
          },
          {
            "id": "iyKgM2",
            "default": 1,
            "unit": "kg m2",
            "min": 1e-9,
            "max": 1000000000000,
            "value": 1
          },
          {
            "id": "izKgM2",
            "default": 1,
            "unit": "kg m2",
            "min": 1e-9,
            "max": 1000000000000,
            "value": 1
          },
          {
            "id": "vxMS",
            "default": 0,
            "unit": "m/s",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          },
          {
            "id": "vyMS",
            "default": 0,
            "unit": "m/s",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          },
          {
            "id": "vzMS",
            "default": 0,
            "unit": "m/s",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          },
          {
            "id": "wxRadS",
            "default": 0,
            "unit": "rad/s",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          },
          {
            "id": "wyRadS",
            "default": 0,
            "unit": "rad/s",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          },
          {
            "id": "wzRadS",
            "default": 0,
            "unit": "rad/s",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          },
          {
            "id": "gravityMS2",
            "default": 9.80665,
            "unit": "m/s2",
            "min": 0,
            "max": 1000000,
            "value": 9.80665
          }
        ]
      }
    },
    {
      "type": "capacitor",
      "namespace": "physical",
      "slug": "capacitor",
      "canonicalSlug": "capacitor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "capacitor",
        "name": "Capacitor",
        "domain": "electrical",
        "family": "capacitor",
        "operation": "Stores electrical charge; current changes its voltage over time.",
        "mechanism": [
          "Current",
          "Charge storage",
          "Voltage"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "current-source",
            "label": "Controlled current source"
          },
          {
            "type": "initial-voltage-constraint",
            "label": "Open branch with initial voltage target"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H85M85 10V70M115 10V70M115 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "capacitanceF",
            "default": 0.001,
            "unit": "F",
            "min": 1e-12,
            "max": 1000000,
            "value": 0.001
          },
          {
            "id": "initialVoltageV",
            "default": 0,
            "unit": "V",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "charging-policy",
      "namespace": "physical",
      "slug": "charging-policy",
      "canonicalSlug": "charging-policy",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "charging-policy",
        "name": "Charging schedule and target policy",
        "domain": "signal",
        "family": "controller",
        "operation": "Evaluates availability, schedule, target charge and protection conditions to request charging power and permission.",
        "mechanism": [
          "Schedule and battery state",
          "Charging policy",
          "Permission and power request"
        ],
        "ports": [],
        "terms": [
          {
            "type": "regulated-charger",
            "label": "Regulated CC/CV charger"
          },
          {
            "type": "signal-schedule",
            "label": "Physical availability / signal schedule"
          }
        ],
        "symbol": [
          {
            "tag": "rect",
            "attrs": {
              "x": 55,
              "y": 15,
              "width": 90,
              "height": 50,
              "rx": 3
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H55M145 40H190M75 50L90 30L105 50L125 25"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "soc",
            "label": "State of charge",
            "quantity": "fraction",
            "unit": "fraction",
            "active": true,
            "summary": "State of charge is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "connected",
            "label": "Connection status",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Connection status is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "available",
            "label": "Availability",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Availability is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "bmsPermit",
            "label": "Battery protection permission",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Battery protection permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "temperature",
            "label": "Battery temperature",
            "quantity": "temperature",
            "unit": "K",
            "active": true,
            "summary": "Battery temperature is a directed temperature input to this component, expressed in K. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "sitePower",
            "label": "Available site power",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Available site power is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "chargerDone",
            "label": "Charging complete",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Charging complete is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "permit",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "permit",
            "unit": "1"
          },
          {
            "id": "requestPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "request Power",
            "unit": "W"
          },
          {
            "id": "currentCap",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current Cap",
            "unit": "A"
          },
          {
            "id": "price",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "price",
            "unit": "1"
          },
          {
            "id": "state",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "state",
            "unit": "1"
          },
          {
            "id": "reason",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "reason",
            "unit": "1"
          },
          {
            "id": "shortfallJ",
            "quantity": "energy",
            "declared": true,
            "consumers": [],
            "label": "shortfall J",
            "unit": "J"
          },
          {
            "id": "departureShortfallJ",
            "quantity": "energy",
            "declared": true,
            "consumers": [],
            "label": "departure Shortfall J",
            "unit": "J"
          },
          {
            "id": "targetSoc",
            "quantity": "fraction",
            "declared": true,
            "consumers": [],
            "label": "target Soc",
            "unit": "fraction"
          }
        ],
        "parameters": [
          {
            "id": "sampleTimeS",
            "default": 1,
            "unit": "s",
            "min": 0.001,
            "max": 3600,
            "value": 1
          },
          {
            "id": "strategy",
            "default": 1,
            "unit": "0 immediate, 1 scheduled, 2 opportunity, 3 maintenance",
            "min": 0,
            "max": 3,
            "value": 1
          },
          {
            "id": "chemistry",
            "default": 0,
            "unit": "0 Li-ion, 1 lead-acid",
            "min": 0,
            "max": 1,
            "value": 0
          },
          {
            "id": "targetSoc",
            "default": 0.8,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0.8
          },
          {
            "id": "restartSoc",
            "default": 0.7,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0.7
          },
          {
            "id": "departureS",
            "default": 86400,
            "unit": "s (0 disables departure)",
            "min": 0,
            "max": 1000000000,
            "value": 86400
          },
          {
            "id": "maxPowerW",
            "default": 7000,
            "unit": "W grid-side",
            "min": 0,
            "max": 1000000000,
            "value": 7000
          },
          {
            "id": "maxCurrentA",
            "default": 32,
            "unit": "A",
            "min": 0,
            "max": 1000000,
            "value": 32
          },
          {
            "id": "capacityAh",
            "default": 100,
            "unit": "Ah",
            "min": 0.000001,
            "max": 1000000000,
            "value": 100
          },
          {
            "id": "nominalVoltageV",
            "default": 350,
            "unit": "V",
            "min": 0.01,
            "max": 1000000,
            "value": 350
          },
          {
            "id": "minTemperatureK",
            "default": 273.15,
            "unit": "K",
            "min": 1,
            "max": 1000,
            "value": 273.15
          },
          {
            "id": "maxTemperatureK",
            "default": 318.15,
            "unit": "K",
            "min": 1,
            "max": 1000,
            "value": 318.15
          },
          {
            "id": "pricePerKWh",
            "default": 0.2,
            "unit": "currency/kWh",
            "min": 0,
            "max": 1000000,
            "value": 0.2
          },
          {
            "id": "startS",
            "default": 0,
            "unit": "s",
            "min": 0,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "endS",
            "default": 86400,
            "unit": "s",
            "min": 0,
            "max": 1000000000,
            "value": 86400
          },
          {
            "id": "repeatPeriodS",
            "default": 0,
            "unit": "s (0 absolute)",
            "min": 0,
            "max": 1000000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "current-gain-source",
      "namespace": "physical",
      "slug": "current-gain-source",
      "canonicalSlug": "current-gain-source",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "current-gain-source",
        "name": "Current-controlled current source",
        "domain": "electrical",
        "family": "amplifier",
        "operation": "Imposes output current proportional to current through its zero-voltage-drop control branch. This ideal controlled source has an implicit external power supply.",
        "mechanism": [
          "Control current",
          "Current gain",
          "Output current"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "cp",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Control branch positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "cn",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Control branch negative terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "operational-amplifier",
            "label": "Finite-gain operational amplifier"
          },
          {
            "type": "current-sensor",
            "label": "Current sensor / signal adapter"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M60 10L150 40L60 70Z M10 25H60M10 55H60M150 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "gain",
            "default": 2,
            "unit": "A/A",
            "min": -1000000,
            "max": 1000000,
            "value": 2
          }
        ]
      }
    },
    {
      "type": "current-sensor",
      "namespace": "physical",
      "slug": "current-sensor",
      "canonicalSlug": "current-sensor",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "current-sensor",
        "name": "Current sensor / signal adapter",
        "domain": "electrical",
        "family": "sensor",
        "operation": "Measures series current through an ideal branch with zero voltage drop.",
        "mechanism": [
          "Series branch",
          "Zero voltage drop",
          "Current signal"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "voltage-sensor",
            "label": "Voltage sensor / signal adapter"
          },
          {
            "type": "signal-filter",
            "label": "Physical signal filter"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 30
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H70M130 40H190M100 40L116 22M80 52A24 24 0 0 1 120 52"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": []
      }
    },
    {
      "type": "current-source",
      "namespace": "physical",
      "slug": "current-source",
      "canonicalSlug": "current-source",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "current-source",
        "name": "Controlled current source",
        "domain": "electrical",
        "family": "current-source",
        "operation": "Imposes a signed current from p to n; the network determines its terminal voltage.",
        "mechanism": [
          "Current command",
          "Imposed current",
          "Solved voltage"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "electrical-reference",
            "label": "Electrical reference"
          },
          {
            "type": "voltage-source",
            "label": "Controlled voltage source"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 32
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H68M132 40H190M80 40H120L110 30M120 40L110 50"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "command",
            "label": "Current command",
            "quantity": "current",
            "unit": "A",
            "active": true,
            "summary": "Current command is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "currentA",
            "default": 1,
            "unit": "A",
            "min": -1000000,
            "max": 1000000,
            "value": 1
          }
        ]
      }
    },
    {
      "type": "dc-motor",
      "namespace": "physical",
      "slug": "dc-motor",
      "canonicalSlug": "dc-motor",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "dc-motor",
        "name": "DC motor with shaft coupling",
        "domain": "electrical",
        "family": "converter",
        "operation": "Couples electrical current to shaft torque and shaft speed to back EMF, including winding resistance.",
        "mechanism": [
          "Electrical power",
          "Back EMF and torque",
          "Shaft power"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "a",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Shaft side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Shaft side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "shaft-inertia",
            "label": "Shaft inertia"
          },
          {
            "type": "rotational-converter",
            "label": "Ideal rotational motor coupler"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 70,
              "cy": 40,
              "r": 25
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 135,
              "cy": 40,
              "r": 25
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H45M160 40H190M70 30L85 40L70 50M135 30L120 40L135 50"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "shaftPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "shaft Power",
            "unit": "W"
          },
          {
            "id": "loss",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "loss",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "resistanceOhm",
            "default": 1,
            "unit": "ohm",
            "min": 1e-9,
            "max": 1000000,
            "value": 1
          },
          {
            "id": "motorConstant",
            "default": 0.1,
            "unit": "V s/rad = N m/A",
            "min": 1e-9,
            "max": 1000000,
            "value": 0.1
          }
        ]
      }
    },
    {
      "type": "diode",
      "namespace": "physical",
      "slug": "diode",
      "canonicalSlug": "diode",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "diode",
        "name": "Piecewise-linear diode",
        "domain": "electrical",
        "family": "diode",
        "operation": "Conducts above a forward-voltage threshold with finite resistance; its reverse branch follows the declared leakage conductance.",
        "mechanism": [
          "Terminal voltage",
          "Forward threshold",
          "Directional conduction"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "resistor",
            "label": "Resistor"
          },
          {
            "type": "electrical-switch",
            "label": "Controlled electrical switch"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H65M65 15L125 40L65 65V15M125 15V65M125 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "forwardVoltageV",
            "default": 0.7,
            "unit": "V",
            "min": 0,
            "max": 1000,
            "value": 0.7
          },
          {
            "id": "onResistanceOhm",
            "default": 0.01,
            "unit": "ohm",
            "min": 0.000001,
            "max": 1000000000,
            "value": 0.01
          },
          {
            "id": "offConductanceS",
            "default": 0,
            "unit": "S",
            "min": 0,
            "max": 1000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "distance-joint",
      "namespace": "physical",
      "slug": "distance-joint",
      "canonicalSlug": "distance-joint",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "distance-joint",
        "name": "Fixed-distance joint",
        "domain": "mechanical",
        "family": "joint",
        "operation": "Maintains a fixed distance between frame origins while allowing orientation to vary.",
        "mechanism": [
          "Frame separation",
          "Fixed length",
          "Reaction force"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "frame",
            "kind": "conserving",
            "label": "Reference frame A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "frame",
            "kind": "conserving",
            "label": "Attached frame B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "body-inertia",
            "label": "Rigid body and inertia"
          },
          {
            "type": "spring-damper",
            "label": "Axial suspension spring and damper"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H75M125 40H190M100 8V72"
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 25
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "constraintError",
            "quantity": "length",
            "declared": true,
            "consumers": [],
            "label": "constraint Error",
            "unit": "m"
          }
        ],
        "parameters": [
          {
            "id": "lengthM",
            "default": 1,
            "unit": "m",
            "min": 1e-9,
            "max": 1000000000,
            "value": 1
          },
          {
            "id": "stabilizationRadS",
            "default": 5,
            "unit": "rad/s",
            "min": 0,
            "max": 1000,
            "value": 5
          }
        ]
      }
    },
    {
      "type": "edge-cooling-plate",
      "namespace": "physical",
      "slug": "edge-cooling-plate",
      "canonicalSlug": "edge-cooling-plate",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "edge-cooling-plate",
        "name": "Edge-cooled plate",
        "domain": "thermal",
        "family": "cooling",
        "operation": "Exchanges heat between four plate zones, attached bodies and coolant flowing through the declared channel path.",
        "mechanism": [
          "Thermal contacts",
          "Metal and coolant storage",
          "Coolant transport"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal-liquid",
            "kind": "conserving",
            "label": "Coolant terminal A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal-liquid",
            "kind": "conserving",
            "label": "Coolant terminal B",
            "net": null,
            "peers": []
          },
          {
            "id": "h1",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Upper-left thermal contact",
            "net": null,
            "peers": []
          },
          {
            "id": "h2",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Upper-right thermal contact",
            "net": null,
            "peers": []
          },
          {
            "id": "h3",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Lower-left thermal contact",
            "net": null,
            "peers": []
          },
          {
            "id": "h4",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Lower-right thermal contact",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "liquid-reservoir",
            "label": "Coolant pressure and temperature boundary"
          },
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M50 5V60Q50 75 70 75H130Q150 75 150 60V5"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "contactHeat1",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat1",
            "unit": "W"
          },
          {
            "id": "contactHeat2",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat2",
            "unit": "W"
          },
          {
            "id": "contactHeat3",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat3",
            "unit": "W"
          },
          {
            "id": "contactHeat4",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat4",
            "unit": "W"
          },
          {
            "id": "storedEnergy",
            "quantity": "energy",
            "declared": true,
            "consumers": [],
            "label": "stored Energy",
            "unit": "J"
          },
          {
            "id": "massFlow",
            "quantity": "mass-rate",
            "declared": true,
            "consumers": [],
            "label": "mass Flow",
            "unit": "kg/s"
          },
          {
            "id": "pressureDrop",
            "quantity": "pressure",
            "declared": true,
            "consumers": [],
            "label": "pressure Drop",
            "unit": "Pa"
          },
          {
            "id": "hydraulicPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "hydraulic Power",
            "unit": "W"
          },
          {
            "id": "contactHeat",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat",
            "unit": "W"
          },
          {
            "id": "outletTemperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "outlet Temperature",
            "unit": "K"
          }
        ],
        "parameters": [
          {
            "id": "plateCapacityJK",
            "default": 900,
            "unit": "J/K",
            "min": 0.000001,
            "max": 1000000000,
            "value": 900
          },
          {
            "id": "coolantCapacityJK",
            "default": 420,
            "unit": "J/K",
            "min": 0.000001,
            "max": 1000000000,
            "value": 420
          },
          {
            "id": "plateConductanceWK",
            "default": 10,
            "unit": "W/K",
            "min": 0,
            "max": 1000000,
            "value": 10
          },
          {
            "id": "contactConductanceWK",
            "default": 100,
            "unit": "W/K",
            "min": 0.000001,
            "max": 1000000000,
            "value": 100
          },
          {
            "id": "coolantConductanceWK",
            "default": 20,
            "unit": "W/K per segment",
            "min": 0,
            "max": 1000000000,
            "value": 20
          },
          {
            "id": "hydraulicResistance",
            "default": 1000000,
            "unit": "Pa s/kg per channel",
            "min": 0.001,
            "max": 1000000000000000,
            "value": 1000000
          },
          {
            "id": "specificHeatJkgK",
            "default": 4200,
            "unit": "J/(kg K)",
            "min": 1,
            "max": 1000000,
            "value": 4200
          },
          {
            "id": "densityKgM3",
            "default": 1000,
            "unit": "kg/m3",
            "min": 1,
            "max": 100000,
            "value": 1000
          },
          {
            "id": "initialPlateTemperatureK",
            "default": 310,
            "unit": "K",
            "min": 0,
            "max": 5000,
            "value": 310
          },
          {
            "id": "initialCoolantTemperatureK",
            "default": 300,
            "unit": "K",
            "min": 0,
            "max": 5000,
            "value": 300
          }
        ]
      }
    },
    {
      "type": "electrical-gyrator",
      "namespace": "physical",
      "slug": "electrical-gyrator",
      "canonicalSlug": "electrical-gyrator",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "electrical-gyrator",
        "name": "Electrical gyrator",
        "domain": "electrical",
        "family": "converter",
        "operation": "Relates each port voltage to current at the other port with opposing transferred powers.",
        "mechanism": [
          "Electrical port 1",
          "Voltage–current duality",
          "Electrical port 2"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "s",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Secondary positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "t",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Secondary negative terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "ideal-transformer",
            "label": "Ideal transformer"
          },
          {
            "type": "rotational-converter",
            "label": "Ideal rotational motor coupler"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 70,
              "cy": 40,
              "r": 25
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 135,
              "cy": 40,
              "r": 25
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H45M160 40H190M70 30L85 40L70 50M135 30L120 40L135 50"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "voltageSecondary",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage Secondary",
            "unit": "V"
          },
          {
            "id": "currentSecondary",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current Secondary",
            "unit": "A"
          },
          {
            "id": "powerSecondary",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power Secondary",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "gyrationResistanceOhm",
            "default": 1,
            "unit": "ohm",
            "min": 1e-9,
            "max": 1000000000,
            "value": 1
          }
        ]
      }
    },
    {
      "type": "electrical-reference",
      "namespace": "physical",
      "slug": "electrical-reference",
      "canonicalSlug": "electrical-reference",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "electrical-reference",
        "name": "Electrical reference",
        "domain": "electrical",
        "family": "reference",
        "operation": "Sets one electrical connection to zero volts so other voltages have a defined reference.",
        "mechanism": [
          "Voltage datum",
          "V = 0"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Zero-voltage reference",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "voltage-source",
            "label": "Controlled voltage source"
          },
          {
            "type": "resistor",
            "label": "Resistor"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M100 5V35M65 35H135M75 47H125M88 59H112"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": []
      }
    },
    {
      "type": "electrical-switch",
      "namespace": "physical",
      "slug": "electrical-switch",
      "canonicalSlug": "electrical-switch",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "electrical-switch",
        "name": "Controlled electrical switch",
        "domain": "electrical",
        "family": "switch",
        "operation": "Selects a finite on or off resistance according to a control threshold.",
        "mechanism": [
          "Gate command",
          "Threshold",
          "On / off resistance"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "variable-resistor",
            "label": "Controlled resistor"
          },
          {
            "type": "signal-step",
            "label": "Physical signal step"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H65M70 35L125 10M135 40H190"
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 65,
              "cy": 40,
              "r": 4
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 135,
              "cy": 40,
              "r": 4
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "gate",
            "label": "Switch gate",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Switch gate is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "closed",
            "quantity": "fraction",
            "declared": true,
            "consumers": [],
            "label": "closed",
            "unit": "fraction"
          }
        ],
        "parameters": [
          {
            "id": "onResistanceOhm",
            "default": 0.01,
            "unit": "ohm",
            "min": 0.000001,
            "max": 1000000000,
            "value": 0.01
          },
          {
            "id": "offResistanceOhm",
            "default": 1000000000,
            "unit": "ohm",
            "min": 0.000001,
            "max": 1000000000000,
            "value": 1000000000
          },
          {
            "id": "gate",
            "default": 0,
            "unit": "dimensionless",
            "min": 0,
            "max": 1,
            "value": 0
          },
          {
            "id": "threshold",
            "default": 0.5,
            "unit": "dimensionless",
            "min": 0,
            "max": 1,
            "value": 0.5
          }
        ]
      }
    },
    {
      "type": "electrothermal-resistor",
      "namespace": "physical",
      "slug": "electrothermal-resistor",
      "canonicalSlug": "electrothermal-resistor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "electrothermal-resistor",
        "name": "Electrothermal resistor",
        "domain": "electrical",
        "family": "resistance",
        "operation": "Changes resistance with temperature and transfers all modeled electrical dissipation into its thermal contact.",
        "mechanism": [
          "Electrical current",
          "Temperature-dependent resistance",
          "Heat at h"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "h",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Heat delivery and temperature contact",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "resistor",
            "label": "Resistor"
          },
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H40L50 20L70 60L90 20L110 60L130 20L150 60L160 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "resistance",
            "quantity": "resistance",
            "declared": true,
            "consumers": [],
            "label": "resistance",
            "unit": "Ω"
          },
          {
            "id": "limited",
            "quantity": "fraction",
            "declared": true,
            "consumers": [],
            "label": "limited",
            "unit": "fraction"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "referenceResistanceOhm",
            "default": 10,
            "unit": "ohm",
            "min": 0.000001,
            "max": 1000000000000,
            "value": 10
          },
          {
            "id": "referenceTemperatureK",
            "default": 300,
            "unit": "K",
            "min": 0,
            "max": 5000,
            "value": 300
          },
          {
            "id": "alphaPerK",
            "default": 0.004,
            "unit": "1/K",
            "min": -1,
            "max": 1,
            "value": 0.004
          },
          {
            "id": "minimumResistanceOhm",
            "default": 0.000001,
            "unit": "ohm",
            "min": 1e-9,
            "max": 1000000000,
            "value": 0.000001
          }
        ]
      }
    },
    {
      "type": "energy-dispatch",
      "namespace": "physical",
      "slug": "energy-dispatch",
      "canonicalSlug": "energy-dispatch",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "energy-dispatch",
        "name": "Scheduled import / export and load policy",
        "domain": "signal",
        "family": "controller",
        "operation": "Chooses a grid import or export power command from a schedule, load-following or outage strategy and charge limits.",
        "mechanism": [
          "Schedule, load and SOC",
          "Dispatch decisions",
          "Signed power command"
        ],
        "ports": [],
        "terms": [
          {
            "type": "bidirectional-grid",
            "label": "Bidirectional grid / load interface"
          },
          {
            "type": "signal-schedule",
            "label": "Physical availability / signal schedule"
          }
        ],
        "symbol": [
          {
            "tag": "rect",
            "attrs": {
              "x": 55,
              "y": 15,
              "width": 90,
              "height": 50,
              "rx": 3
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H55M145 40H190M75 50L90 30L105 50L125 25"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "soc",
            "label": "State of charge",
            "quantity": "fraction",
            "unit": "fraction",
            "active": true,
            "summary": "State of charge is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "connected",
            "label": "Connection status",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Connection status is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "available",
            "label": "Availability",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Availability is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "bmsPermit",
            "label": "Battery protection permission",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Battery protection permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "temperature",
            "label": "Battery temperature",
            "quantity": "temperature",
            "unit": "K",
            "active": true,
            "summary": "Battery temperature is a directed temperature input to this component, expressed in K. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "loadPower",
            "label": "Requested load power",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Requested load power is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "outage",
            "label": "Grid outage status",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Grid outage status is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "command",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "command",
            "unit": "W"
          },
          {
            "id": "state",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "state",
            "unit": "1"
          },
          {
            "id": "reason",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "reason",
            "unit": "1"
          },
          {
            "id": "shortfallJ",
            "quantity": "energy",
            "declared": true,
            "consumers": [],
            "label": "shortfall J",
            "unit": "J"
          },
          {
            "id": "departureShortfallJ",
            "quantity": "energy",
            "declared": true,
            "consumers": [],
            "label": "departure Shortfall J",
            "unit": "J"
          },
          {
            "id": "importPrice",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "import Price",
            "unit": "1"
          },
          {
            "id": "exportPrice",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "export Price",
            "unit": "1"
          }
        ],
        "parameters": [
          {
            "id": "sampleTimeS",
            "default": 60,
            "unit": "s",
            "min": 0.001,
            "max": 3600,
            "value": 60
          },
          {
            "id": "mode",
            "default": 0,
            "unit": "0 schedule, 1 load-following, 2 outage support",
            "min": 0,
            "max": 2,
            "value": 0
          },
          {
            "id": "powerW",
            "default": 0,
            "unit": "W grid import (+), export (-)",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "maxImportW",
            "default": 7000,
            "unit": "W",
            "min": 0,
            "max": 1000000000,
            "value": 7000
          },
          {
            "id": "maxExportW",
            "default": 7000,
            "unit": "W",
            "min": 0,
            "max": 1000000000,
            "value": 7000
          },
          {
            "id": "reserveSoc",
            "default": 0.2,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0.2
          },
          {
            "id": "targetSoc",
            "default": 0.8,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0.8
          },
          {
            "id": "departureS",
            "default": 86400,
            "unit": "s (0 disables departure)",
            "min": 0,
            "max": 1000000000,
            "value": 86400
          },
          {
            "id": "capacityAh",
            "default": 100,
            "unit": "Ah",
            "min": 0.000001,
            "max": 1000000000,
            "value": 100
          },
          {
            "id": "nominalVoltageV",
            "default": 350,
            "unit": "V",
            "min": 0.01,
            "max": 1000000,
            "value": 350
          },
          {
            "id": "minTemperatureK",
            "default": 273.15,
            "unit": "K",
            "min": 1,
            "max": 1000,
            "value": 273.15
          },
          {
            "id": "maxTemperatureK",
            "default": 318.15,
            "unit": "K",
            "min": 1,
            "max": 1000,
            "value": 318.15
          },
          {
            "id": "importPrice",
            "default": 0.2,
            "unit": "currency/kWh",
            "min": 0,
            "max": 1000000,
            "value": 0.2
          },
          {
            "id": "exportPrice",
            "default": 0.1,
            "unit": "currency/kWh",
            "min": 0,
            "max": 1000000,
            "value": 0.1
          },
          {
            "id": "startS",
            "default": 0,
            "unit": "s",
            "min": 0,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "endS",
            "default": 86400,
            "unit": "s",
            "min": 0,
            "max": 1000000000,
            "value": 86400
          },
          {
            "id": "repeatPeriodS",
            "default": 0,
            "unit": "s (0 absolute)",
            "min": 0,
            "max": 1000000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "floating-reference",
      "namespace": "physical",
      "slug": "floating-reference",
      "canonicalSlug": "floating-reference",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "floating-reference",
        "name": "Capacitive floating reference",
        "domain": "electrical",
        "family": "capacitor",
        "operation": "Connects a declared capacitance to the voltage datum without forcing the node to zero volts or adding DC leakage.",
        "mechanism": [
          "Node voltage",
          "Capacitance to datum"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Capacitive datum connection",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "electrical-reference",
            "label": "Electrical reference"
          },
          {
            "type": "capacitor",
            "label": "Capacitor"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H85M85 10V70M115 10V70M115 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "capacitanceF",
            "default": 0.000001,
            "unit": "F",
            "min": 1e-12,
            "max": 1,
            "value": 0.000001
          },
          {
            "id": "initialVoltageV",
            "default": 0,
            "unit": "V",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "force-torque",
      "namespace": "physical",
      "slug": "force-torque",
      "canonicalSlug": "force-torque",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "force-torque",
        "name": "External force and torque",
        "domain": "mechanical",
        "family": "force-source",
        "operation": "Applies a force and torque at frame B with the corresponding reaction at A, expressed in the selected reference frame.",
        "mechanism": [
          "Commanded wrench",
          "Frame B application",
          "Frame A reaction"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "frame",
            "kind": "conserving",
            "label": "Reference frame A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "frame",
            "kind": "conserving",
            "label": "Attached frame B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "body-inertia",
            "label": "Rigid body and inertia"
          },
          {
            "type": "frame-sensor",
            "label": "Relative frame sensor"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M15 40H80L65 25M80 40L65 55M185 40H120L135 25M120 40L135 55"
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 12
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "forceX",
            "label": "force X",
            "quantity": "force",
            "unit": "N",
            "active": true,
            "summary": "force X is a directed force input to this component, expressed in N. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "forceY",
            "label": "force Y",
            "quantity": "force",
            "unit": "N",
            "active": true,
            "summary": "force Y is a directed force input to this component, expressed in N. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "forceZ",
            "label": "force Z",
            "quantity": "force",
            "unit": "N",
            "active": true,
            "summary": "force Z is a directed force input to this component, expressed in N. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "torqueX",
            "label": "torque X",
            "quantity": "torque",
            "unit": "N·m",
            "active": true,
            "summary": "torque X is a directed torque input to this component, expressed in N·m. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "torqueY",
            "label": "torque Y",
            "quantity": "torque",
            "unit": "N·m",
            "active": true,
            "summary": "torque Y is a directed torque input to this component, expressed in N·m. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "torqueZ",
            "label": "torque Z",
            "quantity": "torque",
            "unit": "N·m",
            "active": true,
            "summary": "torque Z is a directed torque input to this component, expressed in N·m. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [],
        "parameters": [
          {
            "id": "forceX",
            "default": 0,
            "unit": "N",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 0
          },
          {
            "id": "forceY",
            "default": 0,
            "unit": "N",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 0
          },
          {
            "id": "forceZ",
            "default": 0,
            "unit": "N",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 0
          },
          {
            "id": "torqueX",
            "default": 0,
            "unit": "N m",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 0
          },
          {
            "id": "torqueY",
            "default": 0,
            "unit": "N m",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 0
          },
          {
            "id": "torqueZ",
            "default": 0,
            "unit": "N m",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 0
          },
          {
            "id": "referenceFrame",
            "default": 0,
            "unit": "0 world, 1 frame A, 2 frame B",
            "min": 0,
            "max": 2,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "frame-sensor",
      "namespace": "physical",
      "slug": "frame-sensor",
      "canonicalSlug": "frame-sensor",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "frame-sensor",
        "name": "Relative frame sensor",
        "domain": "mechanical",
        "family": "sensor",
        "operation": "Reports relative position, velocity and angular velocity of B in the coordinates of frame A.",
        "mechanism": [
          "Frames A and B",
          "Relative motion",
          "Measurement signals"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "frame",
            "kind": "conserving",
            "label": "Reference frame A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "frame",
            "kind": "conserving",
            "label": "Attached frame B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "body-inertia",
            "label": "Rigid body and inertia"
          },
          {
            "type": "frame-transform",
            "label": "Rigid frame transform"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 30
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H70M130 40H190M100 40L116 22M80 52A24 24 0 0 1 120 52"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "position0",
            "quantity": "length",
            "declared": true,
            "consumers": [],
            "label": "position0",
            "unit": "m"
          },
          {
            "id": "position1",
            "quantity": "length",
            "declared": true,
            "consumers": [],
            "label": "position1",
            "unit": "m"
          },
          {
            "id": "position2",
            "quantity": "length",
            "declared": true,
            "consumers": [],
            "label": "position2",
            "unit": "m"
          },
          {
            "id": "velocity0",
            "quantity": "linear-speed",
            "declared": true,
            "consumers": [],
            "label": "velocity0",
            "unit": "m/s"
          },
          {
            "id": "velocity1",
            "quantity": "linear-speed",
            "declared": true,
            "consumers": [],
            "label": "velocity1",
            "unit": "m/s"
          },
          {
            "id": "velocity2",
            "quantity": "linear-speed",
            "declared": true,
            "consumers": [],
            "label": "velocity2",
            "unit": "m/s"
          },
          {
            "id": "omega0",
            "quantity": "speed",
            "declared": true,
            "consumers": [],
            "label": "omega0",
            "unit": "rad/s"
          },
          {
            "id": "omega1",
            "quantity": "speed",
            "declared": true,
            "consumers": [],
            "label": "omega1",
            "unit": "rad/s"
          },
          {
            "id": "omega2",
            "quantity": "speed",
            "declared": true,
            "consumers": [],
            "label": "omega2",
            "unit": "rad/s"
          }
        ],
        "parameters": []
      }
    },
    {
      "type": "frame-transform",
      "namespace": "physical",
      "slug": "frame-transform",
      "canonicalSlug": "frame-transform",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "frame-transform",
        "name": "Rigid frame transform",
        "domain": "mechanical",
        "family": "frame",
        "operation": "Places frame B at a fixed position and orientation relative to frame A; both belong to the same rigid motion.",
        "mechanism": [
          "Frame A",
          "Rigid offset and rotation",
          "Frame B"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "frame",
            "kind": "conserving",
            "label": "Reference frame A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "frame",
            "kind": "conserving",
            "label": "Attached frame B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "world-frame",
            "label": "World frame"
          },
          {
            "type": "body-inertia",
            "label": "Rigid body and inertia"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M75 55V5M75 55H150M75 55L40 75M75 5L70 15M150 55L140 50"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "xM",
            "default": 0,
            "unit": "m",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "yM",
            "default": 0,
            "unit": "m",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "zM",
            "default": 0,
            "unit": "m",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "qw",
            "default": 1,
            "unit": "1",
            "min": -1,
            "max": 1,
            "value": 1
          },
          {
            "id": "qx",
            "default": 0,
            "unit": "1",
            "min": -1,
            "max": 1,
            "value": 0
          },
          {
            "id": "qy",
            "default": 0,
            "unit": "1",
            "min": -1,
            "max": 1,
            "value": 0
          },
          {
            "id": "qz",
            "default": 0,
            "unit": "1",
            "min": -1,
            "max": 1,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "friction-brake",
      "namespace": "physical",
      "slug": "friction-brake",
      "canonicalSlug": "friction-brake",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "friction-brake",
        "name": "Finite-slip friction brake",
        "domain": "mechanical",
        "family": "damper",
        "operation": "Applies bounded friction torque against relative shaft motion; its command sets the available braking torque.",
        "mechanism": [
          "Brake command",
          "Opposing slip torque",
          "Dissipated power"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Shaft side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Shaft side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "shaft-inertia",
            "label": "Shaft inertia"
          },
          {
            "type": "shaft-damper",
            "label": "Shaft viscous loss"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H75M75 20V60M75 20H130M75 60H130M115 25V55M115 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "command",
            "label": "Brake command",
            "quantity": "fraction",
            "unit": "fraction",
            "active": true,
            "summary": "Brake command is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "heat",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "heat",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "maximumTorqueNm",
            "default": 1000,
            "unit": "N m",
            "min": 0,
            "max": 1000000000,
            "value": 1000
          },
          {
            "id": "command",
            "default": 0,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0
          },
          {
            "id": "slipScaleRadS",
            "default": 0.01,
            "unit": "rad/s",
            "min": 1e-9,
            "max": 1000000,
            "value": 0.01
          }
        ]
      }
    },
    {
      "type": "gas-duct",
      "namespace": "physical",
      "slug": "gas-duct",
      "canonicalSlug": "gas-duct",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "gas-duct",
        "name": "Gas resistive duct",
        "domain": "gas",
        "family": "fluid-restriction",
        "operation": "Passes gas in either direction according to a linear pressure-difference conductance.",
        "mechanism": [
          "Pressure difference",
          "Flow resistance",
          "Mass and enthalpy transport"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "gas",
            "kind": "conserving",
            "label": "Gas side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "gas",
            "kind": "conserving",
            "label": "Gas side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "gas-tank",
            "label": "Gas tank / storage"
          },
          {
            "type": "gas-nozzle",
            "label": "Compressible restriction / nozzle"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 15H65L95 32H105L135 15H190M10 65H65L95 48H105L135 65H190M10 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "massFlow",
            "quantity": "mass-rate",
            "declared": true,
            "consumers": [],
            "label": "mass Flow",
            "unit": "kg/s"
          }
        ],
        "parameters": [
          {
            "id": "conductanceKgSPa",
            "default": 1e-7,
            "unit": "kg/(s Pa)",
            "min": 1e-15,
            "max": 1,
            "value": 1e-7
          }
        ]
      }
    },
    {
      "type": "gas-fan",
      "namespace": "physical",
      "slug": "gas-fan",
      "canonicalSlug": "gas-fan",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "gas-fan",
        "name": "Fan pressure curve and power",
        "domain": "gas",
        "family": "fan",
        "operation": "Adds a speed-dependent pressure rise against a flow-resistance curve and accounts for input power.",
        "mechanism": [
          "Speed command",
          "Fan pressure rise",
          "Gas flow and power"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "gas",
            "kind": "conserving",
            "label": "Gas side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "gas",
            "kind": "conserving",
            "label": "Gas side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "gas-duct",
            "label": "Gas resistive duct"
          },
          {
            "type": "gas-sensor",
            "label": "Pressure / temperature sensor"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 32
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H68M132 40H190M100 40C65 10 115 5 100 40C145 30 140 65 100 40C85 80 60 45 100 40"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "speed",
            "label": "Relative fan speed",
            "quantity": "fraction",
            "unit": "fraction",
            "active": true,
            "summary": "Relative fan speed is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "massFlow",
            "quantity": "mass-rate",
            "declared": true,
            "consumers": [],
            "label": "mass Flow",
            "unit": "kg/s"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "fluidPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "fluid Power",
            "unit": "W"
          },
          {
            "id": "loss",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "loss",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "shutoffPressurePa",
            "default": 2000,
            "unit": "Pa",
            "min": 0,
            "max": 100000000,
            "value": 2000
          },
          {
            "id": "linearResistance",
            "default": 1000,
            "unit": "Pa s/m3",
            "min": 0.000001,
            "max": 1000000000000,
            "value": 1000
          },
          {
            "id": "quadraticResistance",
            "default": 1000,
            "unit": "Pa s2/m6",
            "min": 0,
            "max": 1000000000000,
            "value": 1000
          },
          {
            "id": "speed",
            "default": 1,
            "unit": "fraction",
            "min": 0,
            "max": 2,
            "value": 1
          },
          {
            "id": "efficiency",
            "default": 0.8,
            "unit": "fraction",
            "min": 0.000001,
            "max": 1,
            "value": 0.8
          }
        ]
      }
    },
    {
      "type": "gas-nozzle",
      "namespace": "physical",
      "slug": "gas-nozzle",
      "canonicalSlug": "gas-nozzle",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "gas-nozzle",
        "name": "Compressible restriction / nozzle",
        "domain": "gas",
        "family": "fluid-restriction",
        "operation": "Transfers compressible gas through a restriction with subcritical or choked flow, using upstream conditions.",
        "mechanism": [
          "Upstream gas",
          "Compressible restriction",
          "Downstream gas"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "gas",
            "kind": "conserving",
            "label": "Gas side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "gas",
            "kind": "conserving",
            "label": "Gas side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "gas-reservoir",
            "label": "Gas reservoir boundary"
          },
          {
            "type": "gas-valve",
            "label": "Finite-response gas valve"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 15H65L95 32H105L135 15H190M10 65H65L95 48H105L135 65H190M10 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "massFlow",
            "quantity": "mass-rate",
            "declared": true,
            "consumers": [],
            "label": "mass Flow",
            "unit": "kg/s"
          },
          {
            "id": "thrust",
            "quantity": "force",
            "declared": true,
            "consumers": [],
            "label": "thrust",
            "unit": "N"
          }
        ],
        "parameters": [
          {
            "id": "areaM2",
            "default": 0.00001,
            "unit": "m2",
            "min": 1e-12,
            "max": 10,
            "value": 0.00001
          },
          {
            "id": "dischargeCoefficient",
            "default": 0.8,
            "unit": "fraction",
            "min": 1e-9,
            "max": 1,
            "value": 0.8
          },
          {
            "id": "exhaustVelocityMS",
            "default": 0,
            "unit": "m/s effective",
            "min": 0,
            "max": 10000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "gas-plenum",
      "namespace": "physical",
      "slug": "gas-plenum",
      "canonicalSlug": "gas-plenum",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "gas-plenum",
        "name": "Gas plenum / duct storage",
        "domain": "gas",
        "family": "fluid-storage",
        "operation": "Stores a finite mass and internal energy of ideal gas; exchange through the port changes pressure and temperature.",
        "mechanism": [
          "Mass and energy exchange",
          "Finite gas volume",
          "Pressure and temperature"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "gas",
            "kind": "conserving",
            "label": "Stored gas volume connection",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "gas-reservoir",
            "label": "Gas reservoir boundary"
          },
          {
            "type": "gas-duct",
            "label": "Gas resistive duct"
          }
        ],
        "symbol": [
          {
            "tag": "rect",
            "attrs": {
              "x": 55,
              "y": 5,
              "width": 90,
              "height": 70,
              "rx": 3
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H55M65 25H135M65 50H135"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "volumeM3",
            "default": 0.01,
            "unit": "m3",
            "min": 1e-9,
            "max": 1000000,
            "value": 0.01
          },
          {
            "id": "initialPressurePa",
            "default": 101325,
            "unit": "Pa absolute",
            "min": 1,
            "max": 1000000000,
            "value": 101325
          },
          {
            "id": "initialTemperatureK",
            "default": 293.15,
            "unit": "K",
            "min": 1,
            "max": 3000,
            "value": 293.15
          },
          {
            "id": "heatW",
            "default": 0,
            "unit": "W",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "gas-regulator",
      "namespace": "physical",
      "slug": "gas-regulator",
      "canonicalSlug": "gas-regulator",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "gas-regulator",
        "name": "Pressure regulator with dropout",
        "domain": "gas",
        "family": "valve",
        "operation": "Reduces forward flow as downstream pressure approaches its setting; limited upstream pressure causes dropout.",
        "mechanism": [
          "Supply pressure",
          "Pressure regulation",
          "Downstream pressure"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "gas",
            "kind": "conserving",
            "label": "Gas side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "gas",
            "kind": "conserving",
            "label": "Gas side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "gas-reservoir",
            "label": "Gas reservoir boundary"
          },
          {
            "type": "gas-nozzle",
            "label": "Compressible restriction / nozzle"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H60M60 15L140 65V15L60 65V15M140 40H190M100 40V5"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "massFlow",
            "quantity": "mass-rate",
            "declared": true,
            "consumers": [],
            "label": "mass Flow",
            "unit": "kg/s"
          },
          {
            "id": "dropout",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "dropout",
            "unit": "1"
          }
        ],
        "parameters": [
          {
            "id": "areaM2",
            "default": 0.00001,
            "unit": "m2",
            "min": 1e-12,
            "max": 10,
            "value": 0.00001
          },
          {
            "id": "dischargeCoefficient",
            "default": 0.8,
            "unit": "fraction",
            "min": 1e-9,
            "max": 1,
            "value": 0.8
          },
          {
            "id": "setPressurePa",
            "default": 200000,
            "unit": "Pa absolute",
            "min": 1,
            "max": 1000000000,
            "value": 200000
          },
          {
            "id": "droopPa",
            "default": 10000,
            "unit": "Pa",
            "min": 0.000001,
            "max": 1000000000,
            "value": 10000
          }
        ]
      }
    },
    {
      "type": "gas-reservoir",
      "namespace": "physical",
      "slug": "gas-reservoir",
      "canonicalSlug": "gas-reservoir",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "gas-reservoir",
        "name": "Gas reservoir boundary",
        "domain": "gas",
        "family": "fluid-boundary",
        "operation": "Holds gas pressure and temperature at fixed boundary values while supplying or receiving gas.",
        "mechanism": [
          "Fixed pressure and temperature",
          "Open gas boundary"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "gas",
            "kind": "conserving",
            "label": "Pressure and temperature boundary",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "gas-tank",
            "label": "Gas tank / storage"
          },
          {
            "type": "gas-duct",
            "label": "Gas resistive duct"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M190 40H140M140 10V70M65 10H140M65 70H140M75 25H125M75 55H125"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "pressurePa",
            "default": 101325,
            "unit": "Pa absolute",
            "min": 1,
            "max": 1000000000,
            "value": 101325
          },
          {
            "id": "temperatureK",
            "default": 293.15,
            "unit": "K",
            "min": 1,
            "max": 3000,
            "value": 293.15
          }
        ]
      }
    },
    {
      "type": "gas-sensor",
      "namespace": "physical",
      "slug": "gas-sensor",
      "canonicalSlug": "gas-sensor",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "gas-sensor",
        "name": "Pressure / temperature sensor",
        "domain": "gas",
        "family": "sensor",
        "operation": "Reads pressure and temperature on a gas connection without adding storage or a flow restriction.",
        "mechanism": [
          "Gas connection",
          "Pressure and temperature",
          "Measurement signals"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "gas",
            "kind": "conserving",
            "label": "Measured gas connection",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "gas-tank",
            "label": "Gas tank / storage"
          },
          {
            "type": "signal-filter",
            "label": "Physical signal filter"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 30
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H70M130 40H190M100 40L116 22M80 52A24 24 0 0 1 120 52"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "pressure",
            "quantity": "pressure",
            "declared": true,
            "consumers": [],
            "label": "pressure",
            "unit": "Pa"
          },
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          }
        ],
        "parameters": []
      }
    },
    {
      "type": "gas-tank",
      "namespace": "physical",
      "slug": "gas-tank",
      "canonicalSlug": "gas-tank",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "gas-tank",
        "name": "Gas tank / storage",
        "domain": "gas",
        "family": "fluid-storage",
        "operation": "Stores a finite mass and internal energy of ideal gas; exchange through the port changes pressure and temperature.",
        "mechanism": [
          "Mass and energy exchange",
          "Finite gas volume",
          "Pressure and temperature"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "gas",
            "kind": "conserving",
            "label": "Stored gas volume connection",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "gas-reservoir",
            "label": "Gas reservoir boundary"
          },
          {
            "type": "gas-duct",
            "label": "Gas resistive duct"
          }
        ],
        "symbol": [
          {
            "tag": "rect",
            "attrs": {
              "x": 55,
              "y": 5,
              "width": 90,
              "height": 70,
              "rx": 3
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H55M65 25H135M65 50H135"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "volumeM3",
            "default": 0.1,
            "unit": "m3",
            "min": 1e-9,
            "max": 1000000,
            "value": 0.1
          },
          {
            "id": "initialPressurePa",
            "default": 1000000,
            "unit": "Pa absolute",
            "min": 1,
            "max": 1000000000,
            "value": 1000000
          },
          {
            "id": "initialTemperatureK",
            "default": 293.15,
            "unit": "K",
            "min": 1,
            "max": 3000,
            "value": 293.15
          },
          {
            "id": "heatW",
            "default": 0,
            "unit": "W",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "gas-valve",
      "namespace": "physical",
      "slug": "gas-valve",
      "canonicalSlug": "gas-valve",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "gas-valve",
        "name": "Finite-response gas valve",
        "domain": "gas",
        "family": "valve",
        "operation": "A command changes valve opening with finite response time; opening scales the compressible restriction.",
        "mechanism": [
          "Opening command",
          "Finite response",
          "Gas restriction"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "gas",
            "kind": "conserving",
            "label": "Gas side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "gas",
            "kind": "conserving",
            "label": "Gas side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "gas-nozzle",
            "label": "Compressible restriction / nozzle"
          },
          {
            "type": "signal-step",
            "label": "Physical signal step"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H60M60 15L140 65V15L60 65V15M140 40H190M100 40V5"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "command",
            "label": "Opening command",
            "quantity": "fraction",
            "unit": "fraction",
            "active": true,
            "summary": "Opening command is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "massFlow",
            "quantity": "mass-rate",
            "declared": true,
            "consumers": [],
            "label": "mass Flow",
            "unit": "kg/s"
          }
        ],
        "parameters": [
          {
            "id": "areaM2",
            "default": 0.00001,
            "unit": "m2",
            "min": 1e-12,
            "max": 10,
            "value": 0.00001
          },
          {
            "id": "dischargeCoefficient",
            "default": 0.8,
            "unit": "fraction",
            "min": 1e-9,
            "max": 1,
            "value": 0.8
          },
          {
            "id": "command",
            "default": 1,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 1
          },
          {
            "id": "initialOpening",
            "default": 0,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0
          },
          {
            "id": "timeConstantS",
            "default": 0.05,
            "unit": "s",
            "min": 0.000001,
            "max": 1000000,
            "value": 0.05
          }
        ]
      }
    },
    {
      "type": "ideal-transformer",
      "namespace": "physical",
      "slug": "ideal-transformer",
      "canonicalSlug": "ideal-transformer",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "ideal-transformer",
        "name": "Ideal transformer",
        "domain": "electrical",
        "family": "transformer",
        "operation": "Transfers electrical power between ideal windings with a fixed voltage/current ratio and no modeled loss.",
        "mechanism": [
          "Primary winding",
          "Turns ratio",
          "Secondary winding"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "s",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Secondary positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "t",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Secondary negative terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "mutual-inductor",
            "label": "Coupled inductors"
          },
          {
            "type": "electrical-reference",
            "label": "Electrical reference"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 15H55C85 15 85 35 55 35C85 35 85 55 55 55C85 55 85 75 55 75H10M95 10V75M105 10V75M190 15H145C115 15 115 35 145 35C115 35 115 55 145 55C115 55 115 75 145 75H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "voltageSecondary",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage Secondary",
            "unit": "V"
          },
          {
            "id": "currentSecondary",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current Secondary",
            "unit": "A"
          },
          {
            "id": "powerSecondary",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power Secondary",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "turnsRatio",
            "default": 2,
            "unit": "primary/secondary turns",
            "min": 0.000001,
            "max": 1000000,
            "value": 2
          }
        ]
      }
    },
    {
      "type": "inductor",
      "namespace": "physical",
      "slug": "inductor",
      "canonicalSlug": "inductor",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "inductor",
        "name": "Inductor",
        "domain": "electrical",
        "family": "inductor",
        "operation": "Stores magnetic energy; voltage changes its current over time.",
        "mechanism": [
          "Voltage",
          "Magnetic storage",
          "Current"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "voltage-source",
            "label": "Controlled voltage source"
          },
          {
            "type": "mutual-inductor",
            "label": "Coupled inductors"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H40C40 10 70 10 70 40C70 10 100 10 100 40C100 10 130 10 130 40C130 10 160 10 160 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "inductanceH",
            "default": 0.01,
            "unit": "H",
            "min": 1e-12,
            "max": 1000000,
            "value": 0.01
          },
          {
            "id": "initialCurrentA",
            "default": 0,
            "unit": "A",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "initial-temperature-constraint",
      "namespace": "physical",
      "slug": "initial-temperature-constraint",
      "canonicalSlug": "initial-temperature-constraint",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "initial-temperature-constraint",
        "name": "Insulated branch with initial temperature target",
        "domain": "thermal",
        "family": "initial",
        "operation": "Passes no heat and applies an initial temperature-difference target to directly attached storage. It does not hold that difference during the run.",
        "mechanism": [
          "Initial temperature target",
          "Initial consistency",
          "Zero heat transfer"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          },
          {
            "type": "thermal-temperature-source",
            "label": "Temperature difference source"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 30
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M100 20V40L118 50M10 40H70M130 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "temperatureDifference",
            "quantity": "temperature-difference",
            "declared": true,
            "consumers": [],
            "label": "temperature Difference",
            "unit": "K difference"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "initialDifferenceK",
            "default": 0,
            "unit": "K difference",
            "min": -5000,
            "max": 5000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "initial-voltage-constraint",
      "namespace": "physical",
      "slug": "initial-voltage-constraint",
      "canonicalSlug": "initial-voltage-constraint",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "initial-voltage-constraint",
        "name": "Open branch with initial voltage target",
        "domain": "electrical",
        "family": "initial",
        "operation": "Passes zero current while setting or checking an initial voltage target on directly attached capacitance. It does not hold voltage during the run.",
        "mechanism": [
          "Initial voltage target",
          "Initial consistency",
          "Zero branch current"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "capacitor",
            "label": "Capacitor"
          },
          {
            "type": "voltage-source",
            "label": "Controlled voltage source"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 30
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M100 20V40L118 50M10 40H70M130 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "initialVoltageV",
            "default": 0,
            "unit": "V",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "linear-converter",
      "namespace": "physical",
      "slug": "linear-converter",
      "canonicalSlug": "linear-converter",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "linear-converter",
        "name": "Ideal linear motor coupler",
        "domain": "electrical",
        "family": "converter",
        "operation": "Losslessly couples electrical voltage/current to relative linear velocity/force through its conversion constant.",
        "mechanism": [
          "Electrical port",
          "Back EMF and force",
          "Linear port"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "a",
            "domain": "translational",
            "kind": "conserving",
            "label": "Linear side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "translational",
            "kind": "conserving",
            "label": "Linear side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "linear-mass",
            "label": "Translational mass"
          },
          {
            "type": "rotational-converter",
            "label": "Ideal rotational motor coupler"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 70,
              "cy": 40,
              "r": 25
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 135,
              "cy": 40,
              "r": 25
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H45M160 40H190M70 30L85 40L70 50M135 30L120 40L135 50"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "mechanicalPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "mechanical Power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "constant",
            "default": 1,
            "unit": "V s/m = N/A",
            "min": 1e-9,
            "max": 1000000,
            "value": 1
          }
        ]
      }
    },
    {
      "type": "linear-damper",
      "namespace": "physical",
      "slug": "linear-damper",
      "canonicalSlug": "linear-damper",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "linear-damper",
        "name": "Translational damper",
        "domain": "translational",
        "family": "damper",
        "operation": "Applies opposing force proportional to the relative velocity of its two terminals.",
        "mechanism": [
          "Relative velocity",
          "Viscous damping",
          "Dissipated power"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "translational",
            "kind": "conserving",
            "label": "Linear side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "translational",
            "kind": "conserving",
            "label": "Linear side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "linear-mass",
            "label": "Translational mass"
          },
          {
            "type": "linear-spring",
            "label": "Translational spring"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H75M75 20V60M75 20H130M75 60H130M115 25V55M115 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "dampingNsM",
            "default": 1,
            "unit": "N s/m",
            "min": 0,
            "max": 1000000000000,
            "value": 1
          }
        ]
      }
    },
    {
      "type": "linear-mass",
      "namespace": "physical",
      "slug": "linear-mass",
      "canonicalSlug": "linear-mass",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "linear-mass",
        "name": "Translational mass",
        "domain": "translational",
        "family": "inertia",
        "operation": "Stores linear kinetic energy; net force changes its velocity and position.",
        "mechanism": [
          "Net force",
          "Linear mass",
          "Velocity and position"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "translational",
            "kind": "conserving",
            "label": "Inertial linear connection",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "linear-spring",
            "label": "Translational spring"
          },
          {
            "type": "linear-damper",
            "label": "Translational damper"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 30
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 13
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H70M130 40H190M100 10V27M100 53V70"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "massKg",
            "default": 1,
            "unit": "kg",
            "min": 1e-9,
            "max": 1000000000000,
            "value": 1
          },
          {
            "id": "initialPositionM",
            "default": 0,
            "unit": "m",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "initialVelocityMS",
            "default": 0,
            "unit": "m/s",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "linear-reference",
      "namespace": "physical",
      "slug": "linear-reference",
      "canonicalSlug": "linear-reference",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "linear-reference",
        "name": "Translational reference",
        "domain": "translational",
        "family": "reference",
        "operation": "Fixes a linear connection to zero position and zero velocity.",
        "mechanism": [
          "Linear datum",
          "x = 0; v = 0"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "translational",
            "kind": "conserving",
            "label": "Fixed linear reference",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "linear-mass",
            "label": "Translational mass"
          },
          {
            "type": "linear-spring",
            "label": "Translational spring"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M100 5V35M65 35H135M75 47H125M88 59H112"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": []
      }
    },
    {
      "type": "linear-spring",
      "namespace": "physical",
      "slug": "linear-spring",
      "canonicalSlug": "linear-spring",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "linear-spring",
        "name": "Translational spring",
        "domain": "translational",
        "family": "spring",
        "operation": "Applies elastic force from relative displacement, storing and releasing mechanical energy.",
        "mechanism": [
          "Relative displacement",
          "Spring stiffness",
          "Elastic force"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "translational",
            "kind": "conserving",
            "label": "Linear side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "translational",
            "kind": "conserving",
            "label": "Linear side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "linear-mass",
            "label": "Translational mass"
          },
          {
            "type": "linear-damper",
            "label": "Translational damper"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H40L50 15L65 65L80 15L95 65L110 15L125 65L140 15L150 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "stiffnessNM",
            "default": 1,
            "unit": "N/m",
            "min": 0,
            "max": 1000000000000,
            "value": 1
          },
          {
            "id": "restPositionM",
            "default": 0,
            "unit": "m",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "liquid-reservoir",
      "namespace": "physical",
      "slug": "liquid-reservoir",
      "canonicalSlug": "liquid-reservoir",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "liquid-reservoir",
        "name": "Coolant pressure and temperature boundary",
        "domain": "thermal-liquid",
        "family": "fluid-boundary",
        "operation": "Sets an ideal coolant pressure and temperature boundary and supplies or receives mass and energy.",
        "mechanism": [
          "Pressure and temperature",
          "Coolant boundary",
          "Mass and energy reaction"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal-liquid",
            "kind": "conserving",
            "label": "Coolant pressure and temperature boundary",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "u-cooling-plate",
            "label": "U-channel plate"
          },
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M190 40H140M140 10V70M65 10H140M65 70H140M75 25H125M75 55H125"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "massFlow",
            "quantity": "mass-rate",
            "declared": true,
            "consumers": [],
            "label": "mass Flow",
            "unit": "kg/s"
          },
          {
            "id": "enthalpyFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "enthalpy Flow",
            "unit": "W"
          },
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "pressure",
            "quantity": "pressure",
            "declared": true,
            "consumers": [],
            "label": "pressure",
            "unit": "Pa"
          }
        ],
        "parameters": [
          {
            "id": "pressurePa",
            "default": 101325,
            "unit": "Pa",
            "min": 1,
            "max": 1000000000,
            "value": 101325
          },
          {
            "id": "temperatureK",
            "default": 300,
            "unit": "K",
            "min": 0,
            "max": 5000,
            "value": 300
          }
        ]
      }
    },
    {
      "type": "memristor",
      "namespace": "physical",
      "slug": "memristor",
      "canonicalSlug": "memristor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "memristor",
        "name": "Bounded drift memristor",
        "domain": "electrical",
        "family": "resistance",
        "operation": "Evolves a bounded internal state that changes resistance between configured limits; it is a synthetic reduced model.",
        "mechanism": [
          "Electrical drive",
          "Bounded internal state",
          "Variable resistance"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "resistor",
            "label": "Resistor"
          },
          {
            "type": "variable-resistor",
            "label": "Controlled resistor"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H40L50 20L70 60L90 20L110 60L130 20L150 60L160 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "resistance",
            "quantity": "resistance",
            "declared": true,
            "consumers": [],
            "label": "resistance",
            "unit": "Ω"
          }
        ],
        "parameters": [
          {
            "id": "onResistanceOhm",
            "default": 200,
            "unit": "ohm",
            "min": 0.000001,
            "max": 1000000000,
            "value": 200
          },
          {
            "id": "offResistanceOhm",
            "default": 1000,
            "unit": "ohm",
            "min": 0.000001,
            "max": 1000000000000,
            "value": 1000
          },
          {
            "id": "thicknessM",
            "default": 2e-8,
            "unit": "m",
            "min": 1e-12,
            "max": 1,
            "value": 2e-8
          },
          {
            "id": "mobilityM2Vs",
            "default": 2e-17,
            "unit": "m2/(V s)",
            "min": 0,
            "max": 1,
            "value": 2e-17
          },
          {
            "id": "initialState",
            "default": 0.5,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0.5
          }
        ]
      }
    },
    {
      "type": "mutual-inductor",
      "namespace": "physical",
      "slug": "mutual-inductor",
      "canonicalSlug": "mutual-inductor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "mutual-inductor",
        "name": "Coupled inductors",
        "domain": "electrical",
        "family": "transformer",
        "operation": "Couples two inductor currents through a positive-definite mutual inductance matrix.",
        "mechanism": [
          "Primary current",
          "Coupled magnetic storage",
          "Secondary current"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "s",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Secondary positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "t",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Secondary negative terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "inductor",
            "label": "Inductor"
          },
          {
            "type": "ideal-transformer",
            "label": "Ideal transformer"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 15H55C85 15 85 35 55 35C85 35 85 55 55 55C85 55 85 75 55 75H10M95 10V75M105 10V75M190 15H145C115 15 115 35 145 35C115 35 115 55 145 55C115 55 115 75 145 75H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "voltageSecondary",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage Secondary",
            "unit": "V"
          },
          {
            "id": "currentSecondary",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current Secondary",
            "unit": "A"
          },
          {
            "id": "powerSecondary",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power Secondary",
            "unit": "W"
          },
          {
            "id": "storedEnergy",
            "quantity": "energy",
            "declared": true,
            "consumers": [],
            "label": "stored Energy",
            "unit": "J"
          }
        ],
        "parameters": [
          {
            "id": "primaryInductanceH",
            "default": 1,
            "unit": "H",
            "min": 1e-9,
            "max": 1000000000,
            "value": 1
          },
          {
            "id": "secondaryInductanceH",
            "default": 1,
            "unit": "H",
            "min": 1e-9,
            "max": 1000000000,
            "value": 1
          },
          {
            "id": "coupling",
            "default": 0.5,
            "unit": "fraction",
            "min": -0.999999,
            "max": 0.999999,
            "value": 0.5
          },
          {
            "id": "initialPrimaryCurrentA",
            "default": 0,
            "unit": "A",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          },
          {
            "id": "initialSecondaryCurrentA",
            "default": 0,
            "unit": "A",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "open-circuit",
      "namespace": "physical",
      "slug": "open-circuit",
      "canonicalSlug": "open-circuit",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "open-circuit",
        "name": "Open electrical port",
        "domain": "electrical",
        "family": "open",
        "operation": "Terminates an electrical pin with zero current without fixing its voltage.",
        "mechanism": [
          "Electrical terminal",
          "No branch current"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Open electrical terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "electrical-reference",
            "label": "Electrical reference"
          },
          {
            "type": "voltage-sensor",
            "label": "Voltage sensor / signal adapter"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H80M120 40H190"
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 85,
              "cy": 40,
              "r": 5
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 115,
              "cy": 40,
              "r": 5
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          }
        ],
        "parameters": []
      }
    },
    {
      "type": "operational-amplifier",
      "namespace": "physical",
      "slug": "operational-amplifier",
      "canonicalSlug": "operational-amplifier",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "operational-amplifier",
        "name": "Finite-gain operational amplifier",
        "domain": "electrical",
        "family": "amplifier",
        "operation": "Amplifies the control voltage difference with finite gain and hard output-voltage rails; the control input draws no current.",
        "mechanism": [
          "Control voltage",
          "Gain and rails",
          "Output voltage"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "cp",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Control branch positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "cn",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Control branch negative terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "voltage-gain-source",
            "label": "Voltage-controlled voltage source"
          },
          {
            "type": "voltage-sensor",
            "label": "Voltage sensor / signal adapter"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M60 10L150 40L60 70Z M10 25H60M10 55H60M150 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "gain",
            "default": 100000,
            "unit": "V/V",
            "min": 1,
            "max": 1000000000000,
            "value": 100000
          },
          {
            "id": "minimumOutputV",
            "default": -15,
            "unit": "V",
            "min": -1000000,
            "max": 1000000,
            "value": -15
          },
          {
            "id": "maximumOutputV",
            "default": 15,
            "unit": "V",
            "min": -1000000,
            "max": 1000000,
            "value": 15
          }
        ]
      }
    },
    {
      "type": "parallel-cooling-plate",
      "namespace": "physical",
      "slug": "parallel-cooling-plate",
      "canonicalSlug": "parallel-cooling-plate",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "parallel-cooling-plate",
        "name": "Parallel-channel plate",
        "domain": "thermal",
        "family": "cooling",
        "operation": "Exchanges heat between four plate zones, attached bodies and coolant flowing through the declared channel path.",
        "mechanism": [
          "Thermal contacts",
          "Metal and coolant storage",
          "Coolant transport"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal-liquid",
            "kind": "conserving",
            "label": "Coolant terminal A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal-liquid",
            "kind": "conserving",
            "label": "Coolant terminal B",
            "net": null,
            "peers": []
          },
          {
            "id": "h1",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Upper-left thermal contact",
            "net": null,
            "peers": []
          },
          {
            "id": "h2",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Upper-right thermal contact",
            "net": null,
            "peers": []
          },
          {
            "id": "h3",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Lower-left thermal contact",
            "net": null,
            "peers": []
          },
          {
            "id": "h4",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Lower-right thermal contact",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "liquid-reservoir",
            "label": "Coolant pressure and temperature boundary"
          },
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M50 5V60Q50 75 70 75H130Q150 75 150 60V5"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "contactHeat1",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat1",
            "unit": "W"
          },
          {
            "id": "contactHeat2",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat2",
            "unit": "W"
          },
          {
            "id": "contactHeat3",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat3",
            "unit": "W"
          },
          {
            "id": "contactHeat4",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat4",
            "unit": "W"
          },
          {
            "id": "storedEnergy",
            "quantity": "energy",
            "declared": true,
            "consumers": [],
            "label": "stored Energy",
            "unit": "J"
          },
          {
            "id": "massFlow",
            "quantity": "mass-rate",
            "declared": true,
            "consumers": [],
            "label": "mass Flow",
            "unit": "kg/s"
          },
          {
            "id": "pressureDrop",
            "quantity": "pressure",
            "declared": true,
            "consumers": [],
            "label": "pressure Drop",
            "unit": "Pa"
          },
          {
            "id": "hydraulicPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "hydraulic Power",
            "unit": "W"
          },
          {
            "id": "contactHeat",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat",
            "unit": "W"
          },
          {
            "id": "outletTemperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "outlet Temperature",
            "unit": "K"
          }
        ],
        "parameters": [
          {
            "id": "plateCapacityJK",
            "default": 900,
            "unit": "J/K",
            "min": 0.000001,
            "max": 1000000000,
            "value": 900
          },
          {
            "id": "coolantCapacityJK",
            "default": 420,
            "unit": "J/K",
            "min": 0.000001,
            "max": 1000000000,
            "value": 420
          },
          {
            "id": "plateConductanceWK",
            "default": 10,
            "unit": "W/K",
            "min": 0,
            "max": 1000000,
            "value": 10
          },
          {
            "id": "contactConductanceWK",
            "default": 100,
            "unit": "W/K",
            "min": 0.000001,
            "max": 1000000000,
            "value": 100
          },
          {
            "id": "coolantConductanceWK",
            "default": 20,
            "unit": "W/K per segment",
            "min": 0,
            "max": 1000000000,
            "value": 20
          },
          {
            "id": "hydraulicResistance",
            "default": 1000000,
            "unit": "Pa s/kg per channel",
            "min": 0.001,
            "max": 1000000000000000,
            "value": 1000000
          },
          {
            "id": "specificHeatJkgK",
            "default": 4200,
            "unit": "J/(kg K)",
            "min": 1,
            "max": 1000000,
            "value": 4200
          },
          {
            "id": "densityKgM3",
            "default": 1000,
            "unit": "kg/m3",
            "min": 1,
            "max": 100000,
            "value": 1000
          },
          {
            "id": "initialPlateTemperatureK",
            "default": 310,
            "unit": "K",
            "min": 0,
            "max": 5000,
            "value": 310
          },
          {
            "id": "initialCoolantTemperatureK",
            "default": 300,
            "unit": "K",
            "min": 0,
            "max": 5000,
            "value": 300
          }
        ]
      }
    },
    {
      "type": "passive-supervision-interface",
      "namespace": "physical",
      "slug": "passive-supervision-interface",
      "canonicalSlug": "passive-supervision-interface",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "passive-supervision-interface",
        "name": "Passive cell supervision interface",
        "domain": "electrical",
        "family": "current-source",
        "operation": "Draws a commanded nonnegative discharge current and exposes terminal measurements; it represents a simulated supervision interface.",
        "mechanism": [
          "Discharge command",
          "Current sink",
          "Terminal measurements"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "active-supervision-interface",
            "label": "Active cell supervision interface"
          },
          {
            "type": "battery-ocv",
            "label": "Battery with SOC-dependent OCV"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 32
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H68M132 40H190M80 40H120L110 30M120 40L110 50"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "discharge",
            "label": "Discharge current",
            "quantity": "current",
            "unit": "A",
            "active": true,
            "summary": "Discharge current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "dischargeCurrentA",
            "default": 0,
            "unit": "A",
            "min": 0,
            "max": 1000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "phase-change-mass",
      "namespace": "physical",
      "slug": "phase-change-mass",
      "canonicalSlug": "phase-change-mass",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "phase-change-mass",
        "name": "Phase-change thermal mass",
        "domain": "thermal",
        "family": "thermal-storage",
        "operation": "Stores sensible and latent heat across a finite melting interval; temperature and liquid fraction follow its enthalpy.",
        "mechanism": [
          "Heat exchange",
          "Sensible and latent storage",
          "Temperature and liquid fraction"
        ],
        "ports": [
          {
            "id": "h",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Enthalpy-storage thermal contact",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          },
          {
            "type": "thermal-heat-source",
            "label": "Heat flow source"
          }
        ],
        "symbol": [
          {
            "tag": "rect",
            "attrs": {
              "x": 65,
              "y": 10,
              "width": 70,
              "height": 60,
              "rx": 3
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H65M80 20V60M100 20V60M120 20V60"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "storedEnergy",
            "quantity": "energy",
            "declared": true,
            "consumers": [],
            "label": "stored Energy",
            "unit": "J"
          },
          {
            "id": "liquidFraction",
            "quantity": "fraction",
            "declared": true,
            "consumers": [],
            "label": "liquid Fraction",
            "unit": "fraction"
          }
        ],
        "parameters": [
          {
            "id": "massKg",
            "default": 1,
            "unit": "kg",
            "min": 1e-9,
            "max": 1000000000,
            "value": 1
          },
          {
            "id": "specificHeatJkgK",
            "default": 2000,
            "unit": "J/(kg K)",
            "min": 0.000001,
            "max": 1000000000,
            "value": 2000
          },
          {
            "id": "latentHeatJkg",
            "default": 200000,
            "unit": "J/kg",
            "min": 0,
            "max": 1000000000,
            "value": 200000
          },
          {
            "id": "solidusK",
            "default": 330,
            "unit": "K",
            "min": 0,
            "max": 5000,
            "value": 330
          },
          {
            "id": "liquidusK",
            "default": 334,
            "unit": "K",
            "min": 0,
            "max": 5000,
            "value": 334
          },
          {
            "id": "initialTemperatureK",
            "default": 300,
            "unit": "K",
            "min": 0,
            "max": 5000,
            "value": 300
          }
        ]
      }
    },
    {
      "type": "plane-contact",
      "namespace": "physical",
      "slug": "plane-contact",
      "canonicalSlug": "plane-contact",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "plane-contact",
        "name": "Compliant unilateral plane contact",
        "domain": "mechanical",
        "family": "contact",
        "operation": "Applies compliant normal contact and friction when the body penetrates the modeled plane. Separation removes contact force.",
        "mechanism": [
          "Contact gap",
          "Compression and slip",
          "Normal and friction forces"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "frame",
            "kind": "conserving",
            "label": "Reference frame A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "frame",
            "kind": "conserving",
            "label": "Attached frame B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "body-inertia",
            "label": "Rigid body and inertia"
          },
          {
            "type": "tyre-contact",
            "label": "Combined-slip tyre and compliant road contact"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M25 65H180M45 70L35 78M80 70L70 78M115 70L105 78M150 70L140 78"
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 35,
              "r": 29
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "gap",
            "quantity": "length",
            "declared": true,
            "consumers": [],
            "label": "gap",
            "unit": "m"
          },
          {
            "id": "normalForce",
            "quantity": "force",
            "declared": true,
            "consumers": [],
            "label": "normal Force",
            "unit": "N"
          }
        ],
        "parameters": [
          {
            "id": "radiusM",
            "default": 0,
            "unit": "m",
            "min": 0,
            "max": 1000000,
            "value": 0
          },
          {
            "id": "stiffnessNM",
            "default": 10000,
            "unit": "N/m",
            "min": 1e-9,
            "max": 1000000000000,
            "value": 10000
          },
          {
            "id": "dampingNSM",
            "default": 100,
            "unit": "N s/m",
            "min": 0,
            "max": 1000000000000,
            "value": 100
          },
          {
            "id": "friction",
            "default": 0,
            "unit": "1",
            "min": 0,
            "max": 10,
            "value": 0
          },
          {
            "id": "slipScaleMS",
            "default": 0.01,
            "unit": "m/s",
            "min": 1e-9,
            "max": 1000000,
            "value": 0.01
          }
        ]
      }
    },
    {
      "type": "power-load",
      "namespace": "physical",
      "slug": "power-load",
      "canonicalSlug": "power-load",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "power-load",
        "name": "Limited P/V electrical load",
        "domain": "electrical",
        "family": "resistance",
        "operation": "Draws current from a requested electrical power, with a voltage floor and a current limit.",
        "mechanism": [
          "Power request",
          "P / V with limits",
          "Current demand"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "battery-source",
            "label": "Battery: resistance and charge state"
          },
          {
            "type": "current-sensor",
            "label": "Current sensor / signal adapter"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H40L50 20L70 60L90 20L110 60L130 20L150 60L160 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "command",
            "label": "Power request",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Power request is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "requestedPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "requested Power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "powerW",
            "default": 100,
            "unit": "W",
            "min": 0,
            "max": 1000000000,
            "value": 100
          },
          {
            "id": "minimumVoltageV",
            "default": 1,
            "unit": "V",
            "min": 0.000001,
            "max": 1000000,
            "value": 1
          },
          {
            "id": "currentLimitA",
            "default": 100,
            "unit": "A",
            "min": 0,
            "max": 1000000,
            "value": 100
          }
        ]
      }
    },
    {
      "type": "regulated-charger",
      "namespace": "physical",
      "slug": "regulated-charger",
      "canonicalSlug": "regulated-charger",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "regulated-charger",
        "name": "Regulated CC/CV charger",
        "domain": "electrical",
        "family": "controller-power",
        "operation": "Regulates charging current or voltage under sampled enable, temperature, power and battery-protection limits.",
        "mechanism": [
          "Permission and limits",
          "CC / CV regulation",
          "Battery charging"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "charging-policy",
            "label": "Charging schedule and target policy"
          },
          {
            "type": "battery-ocv",
            "label": "Battery with SOC-dependent OCV"
          }
        ],
        "symbol": [
          {
            "tag": "rect",
            "attrs": {
              "x": 60,
              "y": 10,
              "width": 80,
              "height": 60,
              "rx": 3
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H60M140 40H190M80 55V25H95M105 55V25H120"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "trigger",
            "label": "Regulator trigger",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Regulator trigger is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "enable",
            "label": "Enable",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Enable is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "currentLimit",
            "label": "Current limit",
            "quantity": "current",
            "unit": "A",
            "active": true,
            "summary": "Current limit is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "powerLimit",
            "label": "Power limit",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Power limit is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "bmsPermit",
            "label": "Battery protection permission",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Battery protection permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "temperature",
            "label": "Battery temperature",
            "quantity": "temperature",
            "unit": "K",
            "active": true,
            "summary": "Battery temperature is a directed temperature input to this component, expressed in K. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "price",
            "label": "Energy price",
            "quantity": "dimensionless",
            "unit": "currency/kWh (dimensionless signal)",
            "active": true,
            "summary": "Energy price is a directed dimensionless input to this component, expressed in currency/kWh (dimensionless signal). Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "soc",
            "label": "State of charge",
            "quantity": "fraction",
            "unit": "fraction",
            "active": true,
            "summary": "State of charge is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "connected",
            "label": "Connection status",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Connection status is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "state",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "state",
            "unit": "1"
          },
          {
            "id": "reason",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "reason",
            "unit": "1"
          },
          {
            "id": "complete",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "complete",
            "unit": "1"
          },
          {
            "id": "chargeCurrent",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "charge Current",
            "unit": "A"
          },
          {
            "id": "gridPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "grid Power",
            "unit": "W"
          },
          {
            "id": "loss",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "loss",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "sampleTimeS",
            "default": 1,
            "unit": "s",
            "min": 0.001,
            "max": 3600,
            "value": 1
          },
          {
            "id": "currentA",
            "default": 32,
            "unit": "A",
            "min": 0.001,
            "max": 1000000,
            "value": 32
          },
          {
            "id": "voltageV",
            "default": 420,
            "unit": "V",
            "min": 0.01,
            "max": 1000000,
            "value": 420
          },
          {
            "id": "cutoffCurrentA",
            "default": 2,
            "unit": "A",
            "min": 0,
            "max": 1000000,
            "value": 2
          },
          {
            "id": "cutoffHoldS",
            "default": 30,
            "unit": "s",
            "min": 0,
            "max": 86400,
            "value": 30
          },
          {
            "id": "prechargeVoltageV",
            "default": 300,
            "unit": "V",
            "min": 0,
            "max": 1000000,
            "value": 300
          },
          {
            "id": "prechargeCurrentA",
            "default": 3,
            "unit": "A",
            "min": 0.001,
            "max": 1000000,
            "value": 3
          },
          {
            "id": "minimumVoltageV",
            "default": 250,
            "unit": "V",
            "min": 0,
            "max": 1000000,
            "value": 250
          },
          {
            "id": "floatVoltageV",
            "default": 405,
            "unit": "V",
            "min": 0.01,
            "max": 1000000,
            "value": 405
          },
          {
            "id": "efficiency",
            "default": 0.95,
            "unit": "fraction",
            "min": 0.01,
            "max": 1,
            "value": 0.95
          },
          {
            "id": "chemistry",
            "default": 0,
            "unit": "0 Li-ion, 1 lead-acid",
            "min": 0,
            "max": 1,
            "value": 0
          },
          {
            "id": "minTemperatureK",
            "default": 273.15,
            "unit": "K",
            "min": 1,
            "max": 1000,
            "value": 273.15
          },
          {
            "id": "maxTemperatureK",
            "default": 318.15,
            "unit": "K",
            "min": 1,
            "max": 1000,
            "value": 318.15
          },
          {
            "id": "capacityAh",
            "default": 100,
            "unit": "Ah for SOC barrier",
            "min": 0.000001,
            "max": 1000000000,
            "value": 100
          },
          {
            "id": "boundaryTimeS",
            "default": 1,
            "unit": "s for SOC boundary barrier",
            "min": 0.001,
            "max": 3600,
            "value": 1
          }
        ]
      }
    },
    {
      "type": "resistor",
      "namespace": "physical",
      "slug": "resistor",
      "canonicalSlug": "resistor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "resistor",
        "name": "Resistor",
        "domain": "electrical",
        "family": "resistance",
        "operation": "A voltage difference drives a proportional current through a resistance, dissipating electrical power.",
        "mechanism": [
          "Voltage difference",
          "Resistance",
          "Current and dissipation"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "voltage-source",
            "label": "Controlled voltage source"
          },
          {
            "type": "electrothermal-resistor",
            "label": "Electrothermal resistor"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H40L50 20L70 60L90 20L110 60L130 20L150 60L160 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "resistanceOhm",
            "default": 1,
            "unit": "ohm",
            "min": 1e-9,
            "max": 1000000000000,
            "value": 1
          }
        ]
      }
    },
    {
      "type": "revolute-joint",
      "namespace": "physical",
      "slug": "revolute-joint",
      "canonicalSlug": "revolute-joint",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "revolute-joint",
        "name": "Revolute joint around frame Z",
        "domain": "mechanical",
        "family": "joint",
        "operation": "Keeps origins coincident and Z axes aligned, allowing relative rotation about that axis.",
        "mechanism": [
          "Coincident origins",
          "Aligned Z axes",
          "Free Z rotation"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "frame",
            "kind": "conserving",
            "label": "Reference frame A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "frame",
            "kind": "conserving",
            "label": "Attached frame B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "body-inertia",
            "label": "Rigid body and inertia"
          },
          {
            "type": "spherical-joint",
            "label": "Spherical joint"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H75M125 40H190M100 8V72"
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 25
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "stabilizationRadS",
            "default": 5,
            "unit": "rad/s",
            "min": 0,
            "max": 1000,
            "value": 5
          }
        ]
      }
    },
    {
      "type": "rotational-converter",
      "namespace": "physical",
      "slug": "rotational-converter",
      "canonicalSlug": "rotational-converter",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "rotational-converter",
        "name": "Ideal rotational motor coupler",
        "domain": "electrical",
        "family": "converter",
        "operation": "Losslessly couples electrical voltage/current to relative shaft speed/torque through its conversion constant.",
        "mechanism": [
          "Electrical port",
          "Back EMF and torque",
          "Rotational port"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "a",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Shaft side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Shaft side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "dc-motor",
            "label": "DC motor with shaft coupling"
          },
          {
            "type": "shaft-inertia",
            "label": "Shaft inertia"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 70,
              "cy": 40,
              "r": 25
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 135,
              "cy": 40,
              "r": 25
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H45M160 40H190M70 30L85 40L70 50M135 30L120 40L135 50"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "mechanicalPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "mechanical Power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "constant",
            "default": 0.1,
            "unit": "V s/rad = N m/A",
            "min": 1e-9,
            "max": 1000000,
            "value": 0.1
          }
        ]
      }
    },
    {
      "type": "shaft-damper",
      "namespace": "physical",
      "slug": "shaft-damper",
      "canonicalSlug": "shaft-damper",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "shaft-damper",
        "name": "Shaft viscous loss",
        "domain": "rotational",
        "family": "damper",
        "operation": "Applies opposing torque proportional to the speed difference between its shafts.",
        "mechanism": [
          "Relative speed",
          "Viscous resistance",
          "Dissipated power"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Shaft side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Shaft side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "shaft-inertia",
            "label": "Shaft inertia"
          },
          {
            "type": "friction-brake",
            "label": "Finite-slip friction brake"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H75M75 20V60M75 20H130M75 60H130M115 25V55M115 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "dampingNms",
            "default": 0.1,
            "unit": "N m s/rad",
            "min": 0,
            "max": 1000000000000,
            "value": 0.1
          }
        ]
      }
    },
    {
      "type": "shaft-frame",
      "namespace": "physical",
      "slug": "shaft-frame",
      "canonicalSlug": "shaft-frame",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "shaft-frame",
        "name": "Shaft to rigid-body frame",
        "domain": "mechanical",
        "family": "converter",
        "operation": "Couples a rotational shaft to one selected axis of a rigid-body frame.",
        "mechanism": [
          "Shaft speed and torque",
          "Selected body axis",
          "Spatial rotation"
        ],
        "ports": [
          {
            "id": "frame",
            "domain": "frame",
            "kind": "conserving",
            "label": "Rigid-body frame",
            "net": null,
            "peers": []
          },
          {
            "id": "shaft",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Coupled rotational shaft",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "shaft-inertia",
            "label": "Shaft inertia"
          },
          {
            "type": "body-inertia",
            "label": "Rigid body and inertia"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 70,
              "cy": 40,
              "r": 25
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 135,
              "cy": 40,
              "r": 25
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H45M160 40H190M70 30L85 40L70 50M135 30L120 40L135 50"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "axis",
            "default": 1,
            "unit": "0 X, 1 Y, 2 Z",
            "min": 0,
            "max": 2,
            "value": 1
          }
        ]
      }
    },
    {
      "type": "shaft-inertia",
      "namespace": "physical",
      "slug": "shaft-inertia",
      "canonicalSlug": "shaft-inertia",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "shaft-inertia",
        "name": "Shaft inertia",
        "domain": "rotational",
        "family": "inertia",
        "operation": "Stores rotational kinetic energy; net torque changes the shaft speed.",
        "mechanism": [
          "Net torque",
          "Rotational inertia",
          "Angular velocity"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Inertial shaft",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "shaft-torque",
            "label": "Controlled shaft torque"
          },
          {
            "type": "shaft-damper",
            "label": "Shaft viscous loss"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 30
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 13
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H70M130 40H190M100 10V27M100 53V70"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "inertiaKgM2",
            "default": 1,
            "unit": "kg m2",
            "min": 1e-9,
            "max": 1000000000000,
            "value": 1
          },
          {
            "id": "initialSpeedRadS",
            "default": 0,
            "unit": "rad/s",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "shaft-reference",
      "namespace": "physical",
      "slug": "shaft-reference",
      "canonicalSlug": "shaft-reference",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "shaft-reference",
        "name": "Rotational reference",
        "domain": "rotational",
        "family": "reference",
        "operation": "Fixes a shaft connection to zero angular velocity.",
        "mechanism": [
          "Rotational datum",
          "ω = 0"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Fixed shaft reference",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "shaft-inertia",
            "label": "Shaft inertia"
          },
          {
            "type": "shaft-torque",
            "label": "Controlled shaft torque"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M100 5V35M65 35H135M75 47H125M88 59H112"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": []
      }
    },
    {
      "type": "shaft-torque",
      "namespace": "physical",
      "slug": "shaft-torque",
      "canonicalSlug": "shaft-torque",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "shaft-torque",
        "name": "Controlled shaft torque",
        "domain": "rotational",
        "family": "force-source",
        "operation": "Applies equal and opposite commanded torques to its two shaft connections.",
        "mechanism": [
          "Torque command",
          "Opposing shaft torques"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Shaft side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Shaft side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "shaft-inertia",
            "label": "Shaft inertia"
          },
          {
            "type": "shaft-reference",
            "label": "Rotational reference"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M15 40H80L65 25M80 40L65 55M185 40H120L135 25M120 40L135 55"
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 12
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "command",
            "label": "Torque command",
            "quantity": "torque",
            "unit": "N·m",
            "active": true,
            "summary": "Torque command is a directed torque input to this component, expressed in N·m. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [],
        "parameters": [
          {
            "id": "torqueNm",
            "default": 1,
            "unit": "N m",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 1
          }
        ]
      }
    },
    {
      "type": "signal-constant",
      "namespace": "physical",
      "slug": "signal-constant",
      "canonicalSlug": "signal-constant",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "signal-constant",
        "name": "Physical signal source",
        "domain": "signal",
        "family": "signal-source",
        "operation": "Produces a constant signal in the declared physical quantity; it carries information, not conserved power.",
        "mechanism": [
          "Configured value",
          "Typed output"
        ],
        "ports": [],
        "terms": [
          {
            "type": "signal-step",
            "label": "Physical signal step"
          },
          {
            "type": "signal-filter",
            "label": "Physical signal filter"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M15 65V10M15 65H190M30 32H180"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "out",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "Typed signal output",
            "unit": "1"
          }
        ],
        "parameters": [
          {
            "id": "value",
            "default": 0,
            "unit": "declared signal",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "signal-filter",
      "namespace": "physical",
      "slug": "signal-filter",
      "canonicalSlug": "signal-filter",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "signal-filter",
        "name": "Physical signal filter",
        "domain": "signal",
        "family": "filter",
        "operation": "Smooths its input with a first-order response and the configured time constant.",
        "mechanism": [
          "Typed input",
          "First-order response",
          "Filtered output"
        ],
        "ports": [],
        "terms": [
          {
            "type": "signal-step",
            "label": "Physical signal step"
          },
          {
            "type": "voltage-sensor",
            "label": "Voltage sensor / signal adapter"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M15 65V10M15 65H190M30 55C65 55 75 20 180 20"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "input",
            "label": "Input signal",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Input signal is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "out",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "Typed signal output",
            "unit": "1"
          }
        ],
        "parameters": [
          {
            "id": "timeConstantS",
            "default": 0.01,
            "unit": "s",
            "min": 0.000001,
            "max": 1000000000,
            "value": 0.01
          },
          {
            "id": "initial",
            "default": 0,
            "unit": "declared signal",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "signal-schedule",
      "namespace": "physical",
      "slug": "signal-schedule",
      "canonicalSlug": "signal-schedule",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "signal-schedule",
        "name": "Physical availability / signal schedule",
        "domain": "signal",
        "family": "signal-step",
        "operation": "Uses configured time windows to choose a typed signal value, returning to the default outside the windows.",
        "mechanism": [
          "Time windows",
          "Active value",
          "Typed output"
        ],
        "ports": [],
        "terms": [
          {
            "type": "signal-step",
            "label": "Physical signal step"
          },
          {
            "type": "charging-policy",
            "label": "Charging schedule and target policy"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M15 65V10M15 65H190M30 55H95V22H180"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "out",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "Typed signal output",
            "unit": "1"
          }
        ],
        "parameters": [
          {
            "id": "defaultValue",
            "default": 0,
            "unit": "declared signal",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "signal-step",
      "namespace": "physical",
      "slug": "signal-step",
      "canonicalSlug": "signal-step",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "signal-step",
        "name": "Physical signal step",
        "domain": "signal",
        "family": "signal-step",
        "operation": "Changes its typed output from a before value to an after value at the configured simulation time.",
        "mechanism": [
          "Before value",
          "Step time",
          "After value"
        ],
        "ports": [],
        "terms": [
          {
            "type": "signal-constant",
            "label": "Physical signal source"
          },
          {
            "type": "signal-filter",
            "label": "Physical signal filter"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M15 65V10M15 65H190M30 55H95V22H180"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "out",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "Typed signal output",
            "unit": "1"
          }
        ],
        "parameters": [
          {
            "id": "before",
            "default": 0,
            "unit": "declared signal",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 0
          },
          {
            "id": "after",
            "default": 1,
            "unit": "declared signal",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 1
          },
          {
            "id": "atS",
            "default": 1,
            "unit": "s",
            "min": 0,
            "max": 1000000000,
            "value": 1
          }
        ]
      }
    },
    {
      "type": "site-power-allocator",
      "namespace": "physical",
      "slug": "site-power-allocator",
      "canonicalSlug": "site-power-allocator",
      "existing": true,
      "dynamic": true,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "site-power-allocator",
        "name": "Shared site power allocator",
        "domain": "signal",
        "family": "allocator",
        "operation": "Shares a total power limit among configured demand inputs, proportionally or in input-priority order.",
        "mechanism": [
          "Power demands",
          "Shared site limit",
          "Power allocations"
        ],
        "ports": [],
        "terms": [
          {
            "type": "charging-policy",
            "label": "Charging schedule and target policy"
          },
          {
            "type": "regulated-charger",
            "label": "Regulated CC/CV charger"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H90M90 15V65M90 15H190M90 40H190M90 65H190"
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 90,
              "cy": 40,
              "r": 4
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "limit",
            "label": "Site power limit",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Site power limit is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "demand1",
            "label": "Demand 1",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Demand 1 is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "demand2",
            "label": "Demand 2",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Demand 2 is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "demand3",
            "label": "Demand 3",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Demand 3 is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "demand4",
            "label": "Demand 4",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Demand 4 is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "demand5",
            "label": "Demand 5",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Demand 5 is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "demand6",
            "label": "Demand 6",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Demand 6 is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "demand7",
            "label": "Demand 7",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Demand 7 is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "demand8",
            "label": "Demand 8",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Demand 8 is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "totalDemand",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "total Demand",
            "unit": "W"
          },
          {
            "id": "totalAllocated",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "total Allocated",
            "unit": "W"
          },
          {
            "id": "unusedPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "unused Power",
            "unit": "W"
          },
          {
            "id": "allocation1",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "allocation1",
            "unit": "W"
          },
          {
            "id": "allocation2",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "allocation2",
            "unit": "W"
          },
          {
            "id": "allocation3",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "allocation3",
            "unit": "W"
          },
          {
            "id": "allocation4",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "allocation4",
            "unit": "W"
          },
          {
            "id": "allocation5",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "allocation5",
            "unit": "W"
          },
          {
            "id": "allocation6",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "allocation6",
            "unit": "W"
          },
          {
            "id": "allocation7",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "allocation7",
            "unit": "W"
          },
          {
            "id": "allocation8",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "allocation8",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "ports",
            "default": 2,
            "unit": "count",
            "min": 1,
            "max": 8,
            "value": 8
          },
          {
            "id": "limitW",
            "default": 11000,
            "unit": "W grid-side",
            "min": 0,
            "max": 1000000000,
            "value": 11000
          },
          {
            "id": "allocation",
            "default": 0,
            "unit": "0 proportional, 1 input priority",
            "min": 0,
            "max": 1,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "spherical-joint",
      "namespace": "physical",
      "slug": "spherical-joint",
      "canonicalSlug": "spherical-joint",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "spherical-joint",
        "name": "Spherical joint",
        "domain": "mechanical",
        "family": "joint",
        "operation": "Keeps two frame origins coincident while allowing relative rotation. Reaction forces enforce the constraint.",
        "mechanism": [
          "Coincident origins",
          "Free relative rotation",
          "Reaction forces"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "frame",
            "kind": "conserving",
            "label": "Reference frame A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "frame",
            "kind": "conserving",
            "label": "Attached frame B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "body-inertia",
            "label": "Rigid body and inertia"
          },
          {
            "type": "revolute-joint",
            "label": "Revolute joint around frame Z"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H75M125 40H190M100 8V72"
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 25
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "stabilizationRadS",
            "default": 5,
            "unit": "rad/s",
            "min": 0,
            "max": 1000,
            "value": 5
          }
        ]
      }
    },
    {
      "type": "spring-damper",
      "namespace": "physical",
      "slug": "spring-damper",
      "canonicalSlug": "spring-damper",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "spring-damper",
        "name": "Axial suspension spring and damper",
        "domain": "mechanical",
        "family": "spring",
        "operation": "Acts along the line between frames, combining elastic force from extension and viscous force from extension rate.",
        "mechanism": [
          "Relative extension",
          "Spring and damper",
          "Opposing forces"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "frame",
            "kind": "conserving",
            "label": "Reference frame A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "frame",
            "kind": "conserving",
            "label": "Attached frame B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "body-inertia",
            "label": "Rigid body and inertia"
          },
          {
            "type": "linear-spring",
            "label": "Translational spring"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H40L50 15L65 65L80 15L95 65L110 15L125 65L140 15L150 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "length",
            "quantity": "length",
            "declared": true,
            "consumers": [],
            "label": "length",
            "unit": "m"
          },
          {
            "id": "force",
            "quantity": "force",
            "declared": true,
            "consumers": [],
            "label": "force",
            "unit": "N"
          },
          {
            "id": "heat",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "heat",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "restLengthM",
            "default": 1,
            "unit": "m",
            "min": 1e-9,
            "max": 1000000,
            "value": 1
          },
          {
            "id": "stiffnessNM",
            "default": 10000,
            "unit": "N/m",
            "min": 0,
            "max": 1000000000000,
            "value": 10000
          },
          {
            "id": "dampingNSM",
            "default": 100,
            "unit": "N s/m",
            "min": 0,
            "max": 1000000000000,
            "value": 100
          }
        ]
      }
    },
    {
      "type": "thermal-conductor",
      "namespace": "physical",
      "slug": "thermal-conductor",
      "canonicalSlug": "thermal-conductor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-conductor",
        "name": "Thermal conductor",
        "domain": "thermal",
        "family": "thermal-transfer",
        "operation": "Transfers heat by a lumped conductance set by conductivity, area and length.",
        "mechanism": [
          "Temperature difference",
          "Material conductance",
          "Heat flow"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          },
          {
            "type": "thermal-temperature-sensor",
            "label": "Temperature sensor"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "temperatureDifference",
            "quantity": "temperature-difference",
            "declared": true,
            "consumers": [],
            "label": "temperature Difference",
            "unit": "K difference"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "conductivityWmK",
            "default": 200,
            "unit": "W/(m K)",
            "min": 0,
            "max": 1000000,
            "value": 200
          },
          {
            "id": "areaM2",
            "default": 0.001,
            "unit": "m2",
            "min": 1e-12,
            "max": 1000000,
            "value": 0.001
          },
          {
            "id": "lengthM",
            "default": 0.01,
            "unit": "m",
            "min": 1e-12,
            "max": 1000000,
            "value": 0.01
          }
        ]
      }
    },
    {
      "type": "thermal-controlled-heat-source",
      "namespace": "physical",
      "slug": "thermal-controlled-heat-source",
      "canonicalSlug": "thermal-controlled-heat-source",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-controlled-heat-source",
        "name": "Controlled heat flow source",
        "domain": "thermal",
        "family": "heat-source",
        "operation": "Transfers the configured or commanded heat flow from a to b; negative values reverse that transfer.",
        "mechanism": [
          "Heat-flow setting",
          "Energy transfer a → b"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          },
          {
            "type": "thermal-reference",
            "label": "Thermal reference"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 30
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H70M130 40H190M85 55C70 40 105 40 90 20M110 55C95 40 130 40 115 20"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "command",
            "label": "Heat-flow setting",
            "quantity": "heat",
            "unit": "W",
            "active": true,
            "summary": "Heat-flow setting is a directed heat input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "temperatureDifference",
            "quantity": "temperature-difference",
            "declared": true,
            "consumers": [],
            "label": "temperature Difference",
            "unit": "K difference"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "heatFlowW",
            "default": 100,
            "unit": "W",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 100
          }
        ]
      }
    },
    {
      "type": "thermal-controlled-temperature-source",
      "namespace": "physical",
      "slug": "thermal-controlled-temperature-source",
      "canonicalSlug": "thermal-controlled-temperature-source",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-controlled-temperature-source",
        "name": "Controlled temperature difference source",
        "domain": "thermal",
        "family": "temperature-source",
        "operation": "Imposes temperature at b minus temperature at a; the network solves the reaction heat flow needed to enforce it.",
        "mechanism": [
          "Temperature difference",
          "Imposed Tb − Ta",
          "Solved heat flow"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-reference",
            "label": "Thermal reference"
          },
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 53,
              "r": 12
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M93 43V14A7 7 0 0 1 107 14V43M100 48V19M10 40H65M135 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "command",
            "label": "Temperature difference",
            "quantity": "temperature-difference",
            "unit": "K difference",
            "active": true,
            "summary": "Temperature difference is a directed temperature-difference input to this component, expressed in K difference. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "temperatureDifference",
            "quantity": "temperature-difference",
            "declared": true,
            "consumers": [],
            "label": "temperature Difference",
            "unit": "K difference"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "differenceK",
            "default": 300,
            "unit": "K difference",
            "min": -5000,
            "max": 5000,
            "value": 300
          }
        ]
      }
    },
    {
      "type": "thermal-convection",
      "namespace": "physical",
      "slug": "thermal-convection",
      "canonicalSlug": "thermal-convection",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-convection",
        "name": "Thermal convection",
        "domain": "thermal",
        "family": "thermal-transfer",
        "operation": "Transfers heat using a prescribed film coefficient and area; it does not solve the surrounding fluid.",
        "mechanism": [
          "Temperature difference",
          "Film coefficient × area",
          "Heat flow"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          },
          {
            "type": "thermal-temperature-sensor",
            "label": "Temperature sensor"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "temperatureDifference",
            "quantity": "temperature-difference",
            "declared": true,
            "consumers": [],
            "label": "temperature Difference",
            "unit": "K difference"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "coefficientWm2K",
            "default": 10,
            "unit": "W/(m2 K)",
            "min": 0,
            "max": 1000000000,
            "value": 10
          },
          {
            "id": "areaM2",
            "default": 0.2,
            "unit": "m2",
            "min": 1e-12,
            "max": 1000000,
            "value": 0.2
          }
        ]
      }
    },
    {
      "type": "thermal-flow-sensor",
      "namespace": "physical",
      "slug": "thermal-flow-sensor",
      "canonicalSlug": "thermal-flow-sensor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-flow-sensor",
        "name": "Heat flow sensor",
        "domain": "thermal",
        "family": "sensor",
        "operation": "Measures series heat flow with zero temperature difference across its terminals. Positive measured flow is a to b.",
        "mechanism": [
          "Series thermal branch",
          "Zero temperature drop",
          "Heat-flow signal"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-temperature-sensor",
            "label": "Temperature sensor"
          },
          {
            "type": "thermal-conductor",
            "label": "Thermal conductor"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 30
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H70M130 40H190M100 40L116 22M80 52A24 24 0 0 1 120 52"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "temperatureDifference",
            "quantity": "temperature-difference",
            "declared": true,
            "consumers": [],
            "label": "temperature Difference",
            "unit": "K difference"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          }
        ],
        "parameters": []
      }
    },
    {
      "type": "thermal-heat-source",
      "namespace": "physical",
      "slug": "thermal-heat-source",
      "canonicalSlug": "thermal-heat-source",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-heat-source",
        "name": "Heat flow source",
        "domain": "thermal",
        "family": "heat-source",
        "operation": "Transfers the configured or commanded heat flow from a to b; negative values reverse that transfer.",
        "mechanism": [
          "Heat-flow setting",
          "Energy transfer a → b"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          },
          {
            "type": "thermal-reference",
            "label": "Thermal reference"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 30
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H70M130 40H190M85 55C70 40 105 40 90 20M110 55C95 40 130 40 115 20"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "temperatureDifference",
            "quantity": "temperature-difference",
            "declared": true,
            "consumers": [],
            "label": "temperature Difference",
            "unit": "K difference"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "heatFlowW",
            "default": 100,
            "unit": "W",
            "min": -1000000000000,
            "max": 1000000000000,
            "value": 100
          }
        ]
      }
    },
    {
      "type": "thermal-insulator",
      "namespace": "physical",
      "slug": "thermal-insulator",
      "canonicalSlug": "thermal-insulator",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-insulator",
        "name": "Insulated thermal port",
        "domain": "thermal",
        "family": "open",
        "operation": "Terminates a thermal pin with zero heat flow without fixing its temperature.",
        "mechanism": [
          "Thermal contact",
          "No heat transfer"
        ],
        "ports": [
          {
            "id": "h",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Insulated thermal contact",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-reference",
            "label": "Thermal reference"
          },
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H80M120 40H190"
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 85,
              "cy": 40,
              "r": 5
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 115,
              "cy": 40,
              "r": 5
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          }
        ],
        "parameters": []
      }
    },
    {
      "type": "thermal-mass",
      "namespace": "physical",
      "slug": "thermal-mass",
      "canonicalSlug": "thermal-mass",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-mass",
        "name": "Thermal mass",
        "domain": "thermal",
        "family": "thermal-storage",
        "operation": "Stores sensible heat; net heat input changes temperature according to mass times specific heat.",
        "mechanism": [
          "Net heat flow",
          "Heat capacity",
          "Temperature"
        ],
        "ports": [
          {
            "id": "h",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Stored-heat body contact",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-heat-source",
            "label": "Heat flow source"
          },
          {
            "type": "thermal-conductor",
            "label": "Thermal conductor"
          }
        ],
        "symbol": [
          {
            "tag": "rect",
            "attrs": {
              "x": 65,
              "y": 10,
              "width": 70,
              "height": 60,
              "rx": 3
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H65M80 20V60M100 20V60M120 20V60"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "storedEnergy",
            "quantity": "energy",
            "declared": true,
            "consumers": [],
            "label": "stored Energy",
            "unit": "J"
          }
        ],
        "parameters": [
          {
            "id": "massKg",
            "default": 1,
            "unit": "kg",
            "min": 1e-9,
            "max": 1000000000,
            "value": 1
          },
          {
            "id": "specificHeatJkgK",
            "default": 1000,
            "unit": "J/(kg K)",
            "min": 0.000001,
            "max": 1000000000,
            "value": 1000
          },
          {
            "id": "initialTemperatureK",
            "default": 300,
            "unit": "K",
            "min": 0,
            "max": 5000,
            "value": 300
          }
        ]
      }
    },
    {
      "type": "thermal-radiation",
      "namespace": "physical",
      "slug": "thermal-radiation",
      "canonicalSlug": "thermal-radiation",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-radiation",
        "name": "Thermal radiation",
        "domain": "thermal",
        "family": "thermal-transfer",
        "operation": "Exchanges heat according to absolute temperatures to the fourth power, emissivity, area and view factor.",
        "mechanism": [
          "Absolute temperatures",
          "Radiative exchange",
          "Heat flow"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          },
          {
            "type": "thermal-temperature-sensor",
            "label": "Temperature sensor"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "temperatureDifference",
            "quantity": "temperature-difference",
            "declared": true,
            "consumers": [],
            "label": "temperature Difference",
            "unit": "K difference"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "emissivity",
            "default": 0.8,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0.8
          },
          {
            "id": "viewFactor",
            "default": 1,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 1
          },
          {
            "id": "areaM2",
            "default": 0.02,
            "unit": "m2",
            "min": 1e-12,
            "max": 1000000,
            "value": 0.02
          }
        ]
      }
    },
    {
      "type": "thermal-reference",
      "namespace": "physical",
      "slug": "thermal-reference",
      "canonicalSlug": "thermal-reference",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-reference",
        "name": "Thermal reference",
        "domain": "thermal",
        "family": "reference",
        "operation": "Provides an absolute-zero temperature datum; an ambient boundary requires a temperature source.",
        "mechanism": [
          "Absolute temperature datum",
          "T = 0 K"
        ],
        "ports": [
          {
            "id": "h",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Absolute-zero thermal reference",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-temperature-source",
            "label": "Temperature difference source"
          },
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M100 5V35M65 35H135M75 47H125M88 59H112"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "reactionHeat",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "reaction Heat",
            "unit": "W"
          }
        ],
        "parameters": []
      }
    },
    {
      "type": "thermal-resistance",
      "namespace": "physical",
      "slug": "thermal-resistance",
      "canonicalSlug": "thermal-resistance",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-resistance",
        "name": "Thermal resistance",
        "domain": "thermal",
        "family": "thermal-transfer",
        "operation": "Transfers heat in proportion to temperature difference divided by thermal resistance.",
        "mechanism": [
          "Temperature difference",
          "Thermal resistance",
          "Heat flow"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          },
          {
            "type": "thermal-temperature-sensor",
            "label": "Temperature sensor"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "temperatureDifference",
            "quantity": "temperature-difference",
            "declared": true,
            "consumers": [],
            "label": "temperature Difference",
            "unit": "K difference"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "resistanceKW",
            "default": 2,
            "unit": "K/W",
            "min": 1e-9,
            "max": 1000000000000,
            "value": 2
          }
        ]
      }
    },
    {
      "type": "thermal-temperature-sensor",
      "namespace": "physical",
      "slug": "thermal-temperature-sensor",
      "canonicalSlug": "thermal-temperature-sensor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-temperature-sensor",
        "name": "Temperature sensor",
        "domain": "thermal",
        "family": "sensor",
        "operation": "Measures temperature at a and the difference a minus b without transferring heat.",
        "mechanism": [
          "Two temperatures",
          "Nonloading measurement",
          "Temperature signals"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-flow-sensor",
            "label": "Heat flow sensor"
          },
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 30
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H70M130 40H190M100 40L116 22M80 52A24 24 0 0 1 120 52"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "temperatureDifference",
            "quantity": "temperature-difference",
            "declared": true,
            "consumers": [],
            "label": "temperature Difference",
            "unit": "K difference"
          }
        ],
        "parameters": []
      }
    },
    {
      "type": "thermal-temperature-source",
      "namespace": "physical",
      "slug": "thermal-temperature-source",
      "canonicalSlug": "thermal-temperature-source",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-temperature-source",
        "name": "Temperature difference source",
        "domain": "thermal",
        "family": "temperature-source",
        "operation": "Imposes temperature at b minus temperature at a; the network solves the reaction heat flow needed to enforce it.",
        "mechanism": [
          "Temperature difference",
          "Imposed Tb − Ta",
          "Solved heat flow"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-reference",
            "label": "Thermal reference"
          },
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 53,
              "r": 12
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M93 43V14A7 7 0 0 1 107 14V43M100 48V19M10 40H65M135 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "temperatureDifference",
            "quantity": "temperature-difference",
            "declared": true,
            "consumers": [],
            "label": "temperature Difference",
            "unit": "K difference"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "differenceK",
            "default": 300,
            "unit": "K difference",
            "min": -5000,
            "max": 5000,
            "value": 300
          }
        ]
      }
    },
    {
      "type": "thermal-variable-resistance",
      "namespace": "physical",
      "slug": "thermal-variable-resistance",
      "canonicalSlug": "thermal-variable-resistance",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "thermal-variable-resistance",
        "name": "Controlled thermal resistance",
        "domain": "thermal",
        "family": "thermal-transfer",
        "operation": "Transfers heat through a commanded thermal resistance with a positive lower bound.",
        "mechanism": [
          "Resistance command",
          "Temperature difference",
          "Heat flow"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Thermal side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          },
          {
            "type": "thermal-temperature-sensor",
            "label": "Temperature sensor"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "resistance",
            "label": "Resistance command",
            "quantity": "thermal-resistance",
            "unit": "K/W",
            "active": true,
            "summary": "Resistance command is a directed thermal-resistance input to this component, expressed in K/W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "temperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "temperature",
            "unit": "K"
          },
          {
            "id": "temperatureDifference",
            "quantity": "temperature-difference",
            "declared": true,
            "consumers": [],
            "label": "temperature Difference",
            "unit": "K difference"
          },
          {
            "id": "heatFlow",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "heat Flow",
            "unit": "W"
          },
          {
            "id": "resistance",
            "quantity": "thermal-resistance",
            "declared": true,
            "consumers": [],
            "label": "resistance",
            "unit": "K/W"
          },
          {
            "id": "limited",
            "quantity": "fraction",
            "declared": true,
            "consumers": [],
            "label": "limited",
            "unit": "fraction"
          }
        ],
        "parameters": [
          {
            "id": "resistanceKW",
            "default": 2,
            "unit": "K/W",
            "min": 1e-9,
            "max": 1000000000000,
            "value": 2
          },
          {
            "id": "minimumResistanceKW",
            "default": 0.000001,
            "unit": "K/W",
            "min": 1e-12,
            "max": 1000000000,
            "value": 0.000001
          }
        ]
      }
    },
    {
      "type": "transconductance-source",
      "namespace": "physical",
      "slug": "transconductance-source",
      "canonicalSlug": "transconductance-source",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "transconductance-source",
        "name": "Voltage-controlled current source",
        "domain": "electrical",
        "family": "amplifier",
        "operation": "Imposes an output current proportional to a nonloading control voltage. This ideal controlled source has an implicit external power supply.",
        "mechanism": [
          "Control voltage",
          "Transconductance",
          "Output current"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "cp",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Control branch positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "cn",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Control branch negative terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "operational-amplifier",
            "label": "Finite-gain operational amplifier"
          },
          {
            "type": "current-sensor",
            "label": "Current sensor / signal adapter"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M60 10L150 40L60 70Z M10 25H60M10 55H60M150 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "gain",
            "default": 1,
            "unit": "A/V",
            "min": -1000000,
            "max": 1000000,
            "value": 1
          }
        ]
      }
    },
    {
      "type": "transresistance-source",
      "namespace": "physical",
      "slug": "transresistance-source",
      "canonicalSlug": "transresistance-source",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "transresistance-source",
        "name": "Current-controlled voltage source",
        "domain": "electrical",
        "family": "amplifier",
        "operation": "Imposes output voltage proportional to current through its zero-voltage-drop control branch. This ideal controlled source has an implicit external power supply.",
        "mechanism": [
          "Control current",
          "Transresistance",
          "Output voltage"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "cp",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Control branch positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "cn",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Control branch negative terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "operational-amplifier",
            "label": "Finite-gain operational amplifier"
          },
          {
            "type": "current-sensor",
            "label": "Current sensor / signal adapter"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M60 10L150 40L60 70Z M10 25H60M10 55H60M150 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "gain",
            "default": 2,
            "unit": "V/A",
            "min": -1000000,
            "max": 1000000,
            "value": 2
          }
        ]
      }
    },
    {
      "type": "tyre-contact",
      "namespace": "physical",
      "slug": "tyre-contact",
      "canonicalSlug": "tyre-contact",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "tyre-contact",
        "name": "Combined-slip tyre and compliant road contact",
        "domain": "mechanical",
        "family": "contact",
        "operation": "Combines compliant road contact with longitudinal and lateral slip forces, coupled to wheel-shaft torque.",
        "mechanism": [
          "Road contact and slip",
          "Friction limit",
          "Body force and wheel torque"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "frame",
            "kind": "conserving",
            "label": "Reference frame A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "frame",
            "kind": "conserving",
            "label": "Attached frame B",
            "net": null,
            "peers": []
          },
          {
            "id": "shaft",
            "domain": "rotational",
            "kind": "conserving",
            "label": "Wheel rotational shaft",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "plane-contact",
            "label": "Compliant unilateral plane contact"
          },
          {
            "type": "shaft-frame",
            "label": "Shaft to rigid-body frame"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M25 65H180M45 70L35 78M80 70L70 78M115 70L105 78M150 70L140 78"
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 35,
              "r": 29
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "steering",
            "label": "Steering angle",
            "quantity": "dimensionless",
            "unit": "rad (dimensionless signal)",
            "active": true,
            "summary": "Steering angle is a directed dimensionless input to this component, expressed in rad (dimensionless signal). Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "normalForce",
            "quantity": "force",
            "declared": true,
            "consumers": [],
            "label": "normal Force",
            "unit": "N"
          },
          {
            "id": "longitudinalForce",
            "quantity": "force",
            "declared": true,
            "consumers": [],
            "label": "longitudinal Force",
            "unit": "N"
          },
          {
            "id": "lateralForce",
            "quantity": "force",
            "declared": true,
            "consumers": [],
            "label": "lateral Force",
            "unit": "N"
          },
          {
            "id": "slipSpeed",
            "quantity": "linear-speed",
            "declared": true,
            "consumers": [],
            "label": "slip Speed",
            "unit": "m/s"
          },
          {
            "id": "heat",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "heat",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "radiusM",
            "default": 0.3,
            "unit": "m",
            "min": 0.000001,
            "max": 10,
            "value": 0.3
          },
          {
            "id": "normalStiffnessNM",
            "default": 200000,
            "unit": "N/m",
            "min": 0.000001,
            "max": 1000000000000,
            "value": 200000
          },
          {
            "id": "normalDampingNSM",
            "default": 2000,
            "unit": "N s/m",
            "min": 0,
            "max": 1000000000000,
            "value": 2000
          },
          {
            "id": "friction",
            "default": 0.9,
            "unit": "1",
            "min": 0,
            "max": 10,
            "value": 0.9
          },
          {
            "id": "longitudinalStiffness",
            "default": 20000,
            "unit": "N s/m",
            "min": 0,
            "max": 1000000000000,
            "value": 20000
          },
          {
            "id": "lateralStiffness",
            "default": 20000,
            "unit": "N s/m",
            "min": 0,
            "max": 1000000000000,
            "value": 20000
          },
          {
            "id": "steeringRad",
            "default": 0,
            "unit": "rad",
            "min": -1.5,
            "max": 1.5,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "u-cooling-plate",
      "namespace": "physical",
      "slug": "u-cooling-plate",
      "canonicalSlug": "u-cooling-plate",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "u-cooling-plate",
        "name": "U-channel plate",
        "domain": "thermal",
        "family": "cooling",
        "operation": "Exchanges heat between four plate zones, attached bodies and coolant flowing through the declared channel path.",
        "mechanism": [
          "Thermal contacts",
          "Metal and coolant storage",
          "Coolant transport"
        ],
        "ports": [
          {
            "id": "a",
            "domain": "thermal-liquid",
            "kind": "conserving",
            "label": "Coolant terminal A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "thermal-liquid",
            "kind": "conserving",
            "label": "Coolant terminal B",
            "net": null,
            "peers": []
          },
          {
            "id": "h1",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Upper-left thermal contact",
            "net": null,
            "peers": []
          },
          {
            "id": "h2",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Upper-right thermal contact",
            "net": null,
            "peers": []
          },
          {
            "id": "h3",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Lower-left thermal contact",
            "net": null,
            "peers": []
          },
          {
            "id": "h4",
            "domain": "thermal",
            "kind": "conserving",
            "label": "Lower-right thermal contact",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "liquid-reservoir",
            "label": "Coolant pressure and temperature boundary"
          },
          {
            "type": "thermal-mass",
            "label": "Thermal mass"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M50 5V60Q50 75 70 75H130Q150 75 150 60V5"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "contactHeat1",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat1",
            "unit": "W"
          },
          {
            "id": "contactHeat2",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat2",
            "unit": "W"
          },
          {
            "id": "contactHeat3",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat3",
            "unit": "W"
          },
          {
            "id": "contactHeat4",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat4",
            "unit": "W"
          },
          {
            "id": "storedEnergy",
            "quantity": "energy",
            "declared": true,
            "consumers": [],
            "label": "stored Energy",
            "unit": "J"
          },
          {
            "id": "massFlow",
            "quantity": "mass-rate",
            "declared": true,
            "consumers": [],
            "label": "mass Flow",
            "unit": "kg/s"
          },
          {
            "id": "pressureDrop",
            "quantity": "pressure",
            "declared": true,
            "consumers": [],
            "label": "pressure Drop",
            "unit": "Pa"
          },
          {
            "id": "hydraulicPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "hydraulic Power",
            "unit": "W"
          },
          {
            "id": "contactHeat",
            "quantity": "heat",
            "declared": true,
            "consumers": [],
            "label": "contact Heat",
            "unit": "W"
          },
          {
            "id": "outletTemperature",
            "quantity": "temperature",
            "declared": true,
            "consumers": [],
            "label": "outlet Temperature",
            "unit": "K"
          }
        ],
        "parameters": [
          {
            "id": "plateCapacityJK",
            "default": 900,
            "unit": "J/K",
            "min": 0.000001,
            "max": 1000000000,
            "value": 900
          },
          {
            "id": "coolantCapacityJK",
            "default": 420,
            "unit": "J/K",
            "min": 0.000001,
            "max": 1000000000,
            "value": 420
          },
          {
            "id": "plateConductanceWK",
            "default": 10,
            "unit": "W/K",
            "min": 0,
            "max": 1000000,
            "value": 10
          },
          {
            "id": "contactConductanceWK",
            "default": 100,
            "unit": "W/K",
            "min": 0.000001,
            "max": 1000000000,
            "value": 100
          },
          {
            "id": "coolantConductanceWK",
            "default": 20,
            "unit": "W/K per segment",
            "min": 0,
            "max": 1000000000,
            "value": 20
          },
          {
            "id": "hydraulicResistance",
            "default": 1000000,
            "unit": "Pa s/kg per channel",
            "min": 0.001,
            "max": 1000000000000000,
            "value": 1000000
          },
          {
            "id": "specificHeatJkgK",
            "default": 4200,
            "unit": "J/(kg K)",
            "min": 1,
            "max": 1000000,
            "value": 4200
          },
          {
            "id": "densityKgM3",
            "default": 1000,
            "unit": "kg/m3",
            "min": 1,
            "max": 100000,
            "value": 1000
          },
          {
            "id": "initialPlateTemperatureK",
            "default": 310,
            "unit": "K",
            "min": 0,
            "max": 5000,
            "value": 310
          },
          {
            "id": "initialCoolantTemperatureK",
            "default": 300,
            "unit": "K",
            "min": 0,
            "max": 5000,
            "value": 300
          }
        ]
      }
    },
    {
      "type": "v2v-converter",
      "namespace": "physical",
      "slug": "v2v-converter",
      "canonicalSlug": "v2v-converter",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "v2v-converter",
        "name": "Conserving vehicle-to-vehicle converter",
        "domain": "electrical",
        "family": "converter",
        "operation": "Transfers power from a donor battery to a recipient, accounting for conversion efficiency and each battery’s limits.",
        "mechanism": [
          "Donor battery",
          "Conversion and protection",
          "Recipient battery"
        ],
        "ports": [
          {
            "id": "donorP",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Donor positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "donorN",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Donor negative terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "recipientP",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Recipient positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "recipientN",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Recipient negative terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "battery-ocv",
            "label": "Battery with SOC-dependent OCV"
          },
          {
            "type": "bidirectional-grid",
            "label": "Bidirectional grid / load interface"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 70,
              "cy": 40,
              "r": 25
            }
          },
          {
            "tag": "circle",
            "attrs": {
              "cx": 135,
              "cy": 40,
              "r": 25
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H45M160 40H190M70 30L85 40L70 50M135 30L120 40L135 50"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "command",
            "label": "Donor battery",
            "quantity": "power",
            "unit": "W",
            "active": true,
            "summary": "Donor battery is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "donorSoc",
            "label": "Donor state of charge",
            "quantity": "fraction",
            "unit": "fraction",
            "active": true,
            "summary": "Donor state of charge is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "recipientSoc",
            "label": "Recipient state of charge",
            "quantity": "fraction",
            "unit": "fraction",
            "active": true,
            "summary": "Recipient state of charge is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "enable",
            "label": "Enable",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Enable is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "donorBmsPermit",
            "label": "Donor protection permission",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Donor protection permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "recipientBmsPermit",
            "label": "Recipient protection permission",
            "quantity": "dimensionless",
            "unit": "1",
            "active": true,
            "summary": "Recipient protection permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "donorTemperature",
            "label": "Donor temperature",
            "quantity": "temperature",
            "unit": "K",
            "active": true,
            "summary": "Donor temperature is a directed temperature input to this component, expressed in K. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          },
          {
            "id": "recipientTemperature",
            "label": "Recipient temperature",
            "quantity": "temperature",
            "unit": "K",
            "active": true,
            "summary": "Recipient temperature is a directed temperature input to this component, expressed in K. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "donorPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "donor Power",
            "unit": "W"
          },
          {
            "id": "recipientPower",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "recipient Power",
            "unit": "W"
          },
          {
            "id": "loss",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "loss",
            "unit": "W"
          },
          {
            "id": "donorCurrent",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "donor Current",
            "unit": "A"
          },
          {
            "id": "recipientCurrent",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "recipient Current",
            "unit": "A"
          },
          {
            "id": "donorVoltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "donor Voltage",
            "unit": "V"
          },
          {
            "id": "recipientVoltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "recipient Voltage",
            "unit": "V"
          },
          {
            "id": "allowed",
            "quantity": "dimensionless",
            "declared": true,
            "consumers": [],
            "label": "allowed",
            "unit": "1"
          }
        ],
        "parameters": [
          {
            "id": "powerW",
            "default": 3000,
            "unit": "W recipient DC",
            "min": 0,
            "max": 1000000000,
            "value": 3000
          },
          {
            "id": "donorCapacityAh",
            "default": 100,
            "unit": "Ah",
            "min": 0.000001,
            "max": 1000000000,
            "value": 100
          },
          {
            "id": "recipientCapacityAh",
            "default": 100,
            "unit": "Ah",
            "min": 0.000001,
            "max": 1000000000,
            "value": 100
          },
          {
            "id": "donorReserveSoc",
            "default": 0.2,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0.2
          },
          {
            "id": "recipientTargetSoc",
            "default": 0.8,
            "unit": "fraction",
            "min": 0,
            "max": 1,
            "value": 0.8
          },
          {
            "id": "donorMinimumVoltageV",
            "default": 250,
            "unit": "V",
            "min": 0.01,
            "max": 1000000,
            "value": 250
          },
          {
            "id": "donorVoltageDroopOhm",
            "default": 0.01,
            "unit": "ohm near minimum-voltage envelope",
            "min": 0.000001,
            "max": 1000000,
            "value": 0.01
          },
          {
            "id": "recipientVoltageLimitV",
            "default": 420,
            "unit": "V",
            "min": 0.01,
            "max": 1000000,
            "value": 420
          },
          {
            "id": "donorCurrentA",
            "default": 32,
            "unit": "A",
            "min": 0,
            "max": 1000000,
            "value": 32
          },
          {
            "id": "recipientCurrentA",
            "default": 32,
            "unit": "A",
            "min": 0,
            "max": 1000000,
            "value": 32
          },
          {
            "id": "efficiency",
            "default": 0.9,
            "unit": "fraction",
            "min": 0.01,
            "max": 1,
            "value": 0.9
          },
          {
            "id": "boundaryTimeS",
            "default": 1,
            "unit": "s",
            "min": 0.001,
            "max": 3600,
            "value": 1
          },
          {
            "id": "minTemperatureK",
            "default": 273.15,
            "unit": "K",
            "min": 1,
            "max": 1000,
            "value": 273.15
          },
          {
            "id": "maxTemperatureK",
            "default": 318.15,
            "unit": "K",
            "min": 1,
            "max": 1000,
            "value": 318.15
          }
        ]
      }
    },
    {
      "type": "variable-gap-capacitor",
      "namespace": "physical",
      "slug": "variable-gap-capacitor",
      "canonicalSlug": "variable-gap-capacitor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "variable-gap-capacitor",
        "name": "Electromechanical variable-gap capacitor",
        "domain": "electrical",
        "family": "capacitor",
        "operation": "Couples stored electric-field energy to attractive mechanical force; relative a-minus-b motion closes the modeled plate gap.",
        "mechanism": [
          "Electrical field",
          "Variable plate gap",
          "Attractive force"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "a",
            "domain": "translational",
            "kind": "conserving",
            "label": "Linear side A",
            "net": null,
            "peers": []
          },
          {
            "id": "b",
            "domain": "translational",
            "kind": "conserving",
            "label": "Linear side B",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "capacitor",
            "label": "Capacitor"
          },
          {
            "type": "linear-mass",
            "label": "Translational mass"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H85M85 10V70M115 10V70M115 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "gap",
            "quantity": "length",
            "declared": true,
            "consumers": [],
            "label": "gap",
            "unit": "m"
          },
          {
            "id": "force",
            "quantity": "force",
            "declared": true,
            "consumers": [],
            "label": "force",
            "unit": "N"
          },
          {
            "id": "storedEnergy",
            "quantity": "energy",
            "declared": true,
            "consumers": [],
            "label": "stored Energy",
            "unit": "J"
          }
        ],
        "parameters": [
          {
            "id": "areaM2",
            "default": 0.01,
            "unit": "m2",
            "min": 1e-12,
            "max": 1000000,
            "value": 0.01
          },
          {
            "id": "permittivityFm",
            "default": 8.8541878128e-12,
            "unit": "F/m",
            "min": 1e-15,
            "max": 1,
            "value": 8.8541878128e-12
          },
          {
            "id": "initialGapM",
            "default": 0.001,
            "unit": "m",
            "min": 1e-9,
            "max": 1000,
            "value": 0.001
          },
          {
            "id": "minimumGapM",
            "default": 0.000001,
            "unit": "m",
            "min": 1e-12,
            "max": 1000,
            "value": 0.000001
          },
          {
            "id": "initialVoltageV",
            "default": 0,
            "unit": "V",
            "min": -1000000,
            "max": 1000000,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "variable-resistor",
      "namespace": "physical",
      "slug": "variable-resistor",
      "canonicalSlug": "variable-resistor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "variable-resistor",
        "name": "Controlled resistor",
        "domain": "electrical",
        "family": "resistance",
        "operation": "Uses a live resistance command with a positive lower bound to relate voltage and current.",
        "mechanism": [
          "Resistance command",
          "Positive floor",
          "Voltage–current relation"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "resistor",
            "label": "Resistor"
          },
          {
            "type": "electrical-switch",
            "label": "Controlled electrical switch"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H40L50 20L70 60L90 20L110 60L130 20L150 60L160 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "resistance",
            "label": "Resistance command",
            "quantity": "resistance",
            "unit": "Ω",
            "active": true,
            "summary": "Resistance command is a directed resistance input to this component, expressed in Ω. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          },
          {
            "id": "resistance",
            "quantity": "resistance",
            "declared": true,
            "consumers": [],
            "label": "resistance",
            "unit": "Ω"
          },
          {
            "id": "limited",
            "quantity": "fraction",
            "declared": true,
            "consumers": [],
            "label": "limited",
            "unit": "fraction"
          }
        ],
        "parameters": [
          {
            "id": "resistanceOhm",
            "default": 1,
            "unit": "ohm",
            "min": 0.000001,
            "max": 1000000000000,
            "value": 1
          },
          {
            "id": "minimumResistanceOhm",
            "default": 0.000001,
            "unit": "ohm",
            "min": 1e-9,
            "max": 1000000000,
            "value": 0.000001
          }
        ]
      }
    },
    {
      "type": "voltage-gain-source",
      "namespace": "physical",
      "slug": "voltage-gain-source",
      "canonicalSlug": "voltage-gain-source",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "voltage-gain-source",
        "name": "Voltage-controlled voltage source",
        "domain": "electrical",
        "family": "amplifier",
        "operation": "Imposes an output voltage proportional to a nonloading control voltage. This ideal controlled source has an implicit external power supply.",
        "mechanism": [
          "Control voltage",
          "Voltage gain",
          "Output voltage"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "cp",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Control branch positive terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "cn",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Control branch negative terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "operational-amplifier",
            "label": "Finite-gain operational amplifier"
          },
          {
            "type": "current-sensor",
            "label": "Current sensor / signal adapter"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M60 10L150 40L60 70Z M10 25H60M10 55H60M150 40H190"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "gain",
            "default": 2,
            "unit": "V/V",
            "min": -1000000,
            "max": 1000000,
            "value": 2
          }
        ]
      }
    },
    {
      "type": "voltage-sensor",
      "namespace": "physical",
      "slug": "voltage-sensor",
      "canonicalSlug": "voltage-sensor",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "voltage-sensor",
        "name": "Voltage sensor / signal adapter",
        "domain": "electrical",
        "family": "sensor",
        "operation": "Reads p minus n without drawing current. Its voltage signal can drive a controller.",
        "mechanism": [
          "Electrical potential",
          "Nonloading measurement",
          "Voltage signal"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "current-sensor",
            "label": "Current sensor / signal adapter"
          },
          {
            "type": "signal-filter",
            "label": "Physical signal filter"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 30
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H70M130 40H190M100 40L116 22M80 52A24 24 0 0 1 120 52"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          }
        ],
        "parameters": []
      }
    },
    {
      "type": "voltage-source",
      "namespace": "physical",
      "slug": "voltage-source",
      "canonicalSlug": "voltage-source",
      "existing": true,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "voltage-source",
        "name": "Controlled voltage source",
        "domain": "electrical",
        "family": "voltage-source",
        "operation": "Imposes the commanded voltage p minus n; the network determines the required current.",
        "mechanism": [
          "Voltage command",
          "Imposed voltage",
          "Solved current"
        ],
        "ports": [
          {
            "id": "p",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Positive voltage-reference terminal",
            "net": null,
            "peers": []
          },
          {
            "id": "n",
            "domain": "electrical",
            "kind": "conserving",
            "label": "Negative voltage-reference terminal",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "electrical-reference",
            "label": "Electrical reference"
          },
          {
            "type": "current-source",
            "label": "Controlled current source"
          }
        ],
        "symbol": [
          {
            "tag": "circle",
            "attrs": {
              "cx": 100,
              "cy": 40,
              "r": 32
            }
          },
          {
            "tag": "path",
            "attrs": {
              "d": "M10 40H68M132 40H190M100 15V31M92 23H108M92 57H108"
            }
          }
        ],
        "selection": {},
        "commands": [
          {
            "id": "command",
            "label": "Voltage command",
            "quantity": "voltage",
            "unit": "V",
            "active": true,
            "summary": "Voltage command is a directed voltage input to this component, expressed in V. Its binding supplies information; it is not a conserving connection.",
            "source": null,
            "target": null
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "quantity": "voltage",
            "declared": true,
            "consumers": [],
            "label": "voltage",
            "unit": "V"
          },
          {
            "id": "current",
            "quantity": "current",
            "declared": true,
            "consumers": [],
            "label": "current",
            "unit": "A"
          },
          {
            "id": "power",
            "quantity": "power",
            "declared": true,
            "consumers": [],
            "label": "power",
            "unit": "W"
          }
        ],
        "parameters": [
          {
            "id": "voltageV",
            "default": 12,
            "unit": "V",
            "min": -1000000,
            "max": 1000000,
            "value": 12
          }
        ]
      }
    },
    {
      "type": "world-frame",
      "namespace": "physical",
      "slug": "world-frame",
      "canonicalSlug": "world-frame",
      "existing": false,
      "dynamic": false,
      "scene": {
        "kind": "component",
        "componentId": "reference",
        "type": "world-frame",
        "name": "World frame",
        "domain": "mechanical",
        "family": "frame",
        "operation": "Defines a fixed spatial frame from a position and orientation.",
        "mechanism": [
          "World position",
          "Fixed orientation"
        ],
        "ports": [
          {
            "id": "frame",
            "domain": "frame",
            "kind": "conserving",
            "label": "Fixed world frame",
            "net": null,
            "peers": []
          }
        ],
        "terms": [
          {
            "type": "body-inertia",
            "label": "Rigid body and inertia"
          },
          {
            "type": "frame-transform",
            "label": "Rigid frame transform"
          }
        ],
        "symbol": [
          {
            "tag": "path",
            "attrs": {
              "d": "M75 55V5M75 55H150M75 55L40 75M75 5L70 15M150 55L140 50"
            }
          }
        ],
        "selection": {},
        "commands": [],
        "outputs": [],
        "parameters": [
          {
            "id": "xM",
            "default": 0,
            "unit": "m",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "yM",
            "default": 0,
            "unit": "m",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "zM",
            "default": 0,
            "unit": "m",
            "min": -1000000000,
            "max": 1000000000,
            "value": 0
          },
          {
            "id": "qw",
            "default": 1,
            "unit": "1",
            "min": -1,
            "max": 1,
            "value": 1
          },
          {
            "id": "qx",
            "default": 0,
            "unit": "1",
            "min": -1,
            "max": 1,
            "value": 0
          },
          {
            "id": "qy",
            "default": 0,
            "unit": "1",
            "min": -1,
            "max": 1,
            "value": 0
          },
          {
            "id": "qz",
            "default": 0,
            "unit": "1",
            "min": -1,
            "max": 1,
            "value": 0
          }
        ]
      }
    },
    {
      "type": "absolute",
      "namespace": "signal",
      "slug": "signal-block-absolute",
      "canonicalSlug": "signal-block-absolute",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Absolute value",
        "label": "Absolute value",
        "summary": "|x| on one quantity.",
        "details": [
          "Block type: absolute.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Absolute value",
          "caption": "|x| on one quantity."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Input",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-absolute/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-capacity-fit",
      "namespace": "signal",
      "slug": "signal-block-battery-capacity-fit",
      "canonicalSlug": "battery-capacity-fit",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Capacity fit",
        "label": "Capacity fit",
        "summary": "Fits charge capacity through the origin from aligned SOC-change and integrated-charge windows.",
        "details": [
          "Block type: battery-capacity-fit.",
          "2 declared inputs and 5 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Capacity fit",
          "caption": "Fits charge capacity through the origin from aligned SOC-change and integrated-charge windows."
        },
        "inputs": [
          {
            "id": "socChange",
            "label": "SOC decrease per window",
            "quantity": "fraction",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "charge",
            "label": "Removed charge per window (Ah)",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "capacity",
            "label": "Fitted capacity (Ah)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "information",
            "label": "Weighted SOC information",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "residual",
            "label": "Weighted squared residual (Ah²)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "count",
            "label": "Included windows",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Positive identifiable capacity",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"windows\":3,\"minimumInformation\":1e-12}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-capacity-fit/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-capacity-health",
      "namespace": "signal",
      "slug": "signal-block-battery-capacity-health",
      "canonicalSlug": "battery-capacity-health",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Capacity health index",
        "label": "Capacity health index",
        "summary": "Endpoint-normalized health index with raw value and out-of-reference flag.",
        "details": [
          "Block type: battery-capacity-health.",
          "1 declared input and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Capacity health index",
          "caption": "Endpoint-normalized health index with raw value and out-of-reference flag."
        },
        "inputs": [
          {
            "id": "measurement",
            "label": "Measured capacity (Ah)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "health",
            "label": "Clipped health index",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "raw",
            "label": "Unclipped index",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "outside",
            "label": "Outside reference range",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"fresh\":2,\"end\":1.6}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-capacity-health/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-capacity-observer",
      "namespace": "signal",
      "slug": "signal-block-battery-capacity-observer",
      "canonicalSlug": "battery-capacity-observer",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Capacity observer",
        "label": "Capacity observer",
        "summary": "Scalar capacity Kalman update from independent SOC change and removed charge.",
        "details": [
          "Block type: battery-capacity-observer.",
          "4 declared inputs and 5 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Capacity observer",
          "caption": "Scalar capacity Kalman update from independent SOC change and removed charge."
        },
        "inputs": [
          {
            "id": "socChange",
            "label": "Independent SOC decrease",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "charge",
            "label": "Removed charge (Ah)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Window valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "capacity",
            "label": "Estimated capacity (Ah)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Capacity variance (Ah²)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Charge innovation (Ah)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Status (0 prediction, 1 correction, 2 clipped)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"initialCapacityAh\":1.8,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.0004,\"minCapacityAh\":0.1,\"maxCapacityAh\":10}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-capacity-observer/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-cccv-controller",
      "namespace": "signal",
      "slug": "signal-block-battery-cccv-controller",
      "canonicalSlug": "battery-cccv-controller",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "CC-CV current controller",
        "label": "CC-CV current controller",
        "summary": "PI voltage regulation with an external current envelope and anti-windup.",
        "details": [
          "Block type: battery-cccv-controller.",
          "3 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "CC-CV current controller",
          "caption": "PI voltage regulation with an external current envelope and anti-windup."
        },
        "inputs": [
          {
            "id": "voltage",
            "label": "Highest cell voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "limit",
            "label": "Charge-current magnitude limit",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "enable",
            "label": "Enable",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "request",
            "label": "Signed current request (charge negative)",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "mode",
            "label": "Mode (0 disabled, 1 CC, 2 CV)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":0.1,\"targetV\":4,\"kp\":10,\"ki\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-cccv-controller/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-cell-delta-soc-ekf",
      "namespace": "signal",
      "slug": "signal-block-battery-cell-delta-soc-ekf",
      "canonicalSlug": "battery-cell-delta-soc-ekf",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Cell-delta SOC EKF",
        "label": "Cell-delta SOC EKF",
        "summary": "Estimates deviation from a supplied average. Average-error variance enters voltage uncertainty under an explicit independent-error assumption.",
        "details": [
          "Block type: battery-cell-delta-soc-ekf.",
          "6 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "predict → innovation → update",
          "label": "Cell-delta SOC EKF",
          "caption": "Estimates deviation from a supplied average. Average-error variance enters voltage uncertainty under an explicit independent-error assumption."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Series current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltage",
            "label": "Measured cell voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "average",
            "label": "Average SOC",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "averageVariance",
            "label": "Average SOC variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Aligned measurements valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "delta",
            "label": "SOC deviation from average",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "fraction",
            "label": "Reconstructed cell SOC",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Delta SOC variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Cell voltage innovation",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Observer status",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"cellCapacityAh\":2,\"averageCapacityAh\":2,\"initialDelta\":0,\"initialVariance\":0.01,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"ocvTable\":[[0,3],[1,4]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-cell-delta-soc-ekf/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-cell-delta-soc-ekf-variable-resistance",
      "namespace": "signal",
      "slug": "signal-block-battery-cell-delta-soc-ekf-variable-resistance",
      "canonicalSlug": "battery-cell-delta-soc-ekf-variable-resistance",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Cell-delta SOC EKF with resistance input",
        "label": "Cell-delta SOC EKF with resistance input",
        "summary": "Estimates deviation from a supplied average. Average-error variance enters voltage uncertainty under an explicit independent-error assumption.",
        "details": [
          "Block type: battery-cell-delta-soc-ekf-variable-resistance.",
          "7 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "predict → innovation → update",
          "label": "Cell-delta SOC EKF with resistance input",
          "caption": "Estimates deviation from a supplied average. Average-error variance enters voltage uncertainty under an explicit independent-error assumption."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Series current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltage",
            "label": "Measured cell voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "average",
            "label": "Average SOC",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "averageVariance",
            "label": "Average SOC variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Aligned measurements valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "resistance",
            "label": "Cell resistance (ohm)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "delta",
            "label": "SOC deviation from average",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "fraction",
            "label": "Reconstructed cell SOC",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Delta SOC variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Cell voltage innovation",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Observer status",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"cellCapacityAh\":2,\"averageCapacityAh\":2,\"initialDelta\":0,\"initialVariance\":0.01,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"ocvTable\":[[0,3],[1,4]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-cell-delta-soc-ekf-variable-resistance/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-charge-counter",
      "namespace": "signal",
      "slug": "signal-block-battery-charge-counter",
      "canonicalSlug": "battery-charge-counter",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Charge counter",
        "label": "Charge counter",
        "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
        "details": [
          "Block type: battery-charge-counter.",
          "2 declared inputs and 4 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Charge counter",
          "caption": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately."
        },
        "inputs": [
          {
            "id": "rate",
            "label": "Signed battery current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "State of charge",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "throughput",
            "label": "Net throughput (C)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "revaluation",
            "label": "Capacity revaluation (C)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "boundary",
            "label": "Boundary amount (C)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.8,\"chargeEfficiency\":1}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-charge-counter/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-charge-envelope",
      "namespace": "signal",
      "slug": "signal-block-battery-charge-envelope",
      "canonicalSlug": "battery-charge-envelope",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Charge-current envelope",
        "label": "Charge-current envelope",
        "summary": "Selects the most restrictive cell voltage and temperature current limit.",
        "details": [
          "Block type: battery-charge-envelope.",
          "3 declared inputs and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Charge-current envelope",
          "caption": "Selects the most restrictive cell voltage and temperature current limit."
        },
        "inputs": [
          {
            "id": "voltage",
            "label": "Cell voltages",
            "quantity": "voltage",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "temperature",
            "label": "Cell temperatures",
            "quantity": "temperature",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "enable",
            "label": "Enable",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "limit",
            "label": "Allowed current magnitude",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltageLimit",
            "label": "Voltage limit",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "temperatureLimit",
            "label": "Temperature limit",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"cells\":3,\"nominalA\":2,\"voltageTable\":[[4,2],[4.1,0]],\"temperatureTable\":[[273.15,0],[283.15,2],[313.15,2],[323.15,0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-charge-envelope/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-contact-monitor",
      "namespace": "signal",
      "slug": "signal-block-battery-contact-monitor",
      "canonicalSlug": "battery-contact-monitor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Cell contact residual monitor",
        "label": "Cell contact residual monitor",
        "summary": "Filters cell/group voltage residuals against their median and qualifies persistent differences. Residuals are not a unique contact-fault diagnosis.",
        "details": [
          "Block type: battery-contact-monitor.",
          "4 declared inputs and 4 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "signal → bounds → fault",
          "label": "Compare monitored channels",
          "caption": "Filters cell/group voltage residuals against their median and qualifies persistent differences. Residuals are not a unique contact-fault diagnosis."
        },
        "inputs": [
          {
            "id": "measured",
            "label": "Measured cell/group voltages",
            "quantity": "voltage",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "predicted",
            "label": "Predicted healthy voltages",
            "quantity": "voltage",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "current",
            "label": "Signed current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "enable",
            "label": "Enable",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "residual",
            "label": "Filtered differential residual",
            "quantity": "voltage",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "faults",
            "label": "Qualified channel symptoms",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "bool"
          },
          {
            "id": "fault",
            "label": "Any qualified symptom",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "valid",
            "label": "Sufficient current",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"cells\":3,\"filterWeight\":0.5,\"thresholdV\":0.008,\"minCurrentA\":1,\"requiredSamples\":2}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-contact-monitor/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-controlled-discharger",
      "namespace": "signal",
      "slug": "signal-block-battery-controlled-discharger",
      "canonicalSlug": "battery-controlled-discharger",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Controlled discharger",
        "label": "Controlled discharger",
        "summary": "Triggered discharge request with low-voltage/time cutoff, recorded charge and latched completion.",
        "details": [
          "Block type: battery-controlled-discharger.",
          "4 declared inputs and 5 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Controlled discharger",
          "caption": "Triggered discharge request with low-voltage/time cutoff, recorded charge and latched completion."
        },
        "inputs": [
          {
            "id": "voltage",
            "label": "Measured terminal voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "current",
            "label": "Measured discharge current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "trigger",
            "label": "Start trigger",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "enable",
            "label": "Enable",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "request",
            "label": "Discharge-current request",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "done",
            "label": "Complete",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "mode",
            "label": "Mode (0 idle, 1 discharge, 2 complete, 3 paused)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "charge",
            "label": "Removed charge (Ah)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "elapsed",
            "label": "Active discharge time (s)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"currentA\":1,\"cutoffV\":3.2,\"maximumS\":3600}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-controlled-discharger/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-coolant-controller",
      "namespace": "signal",
      "slug": "signal-block-battery-coolant-controller",
      "canonicalSlug": "battery-coolant-controller",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Coolant flow controller",
        "label": "Coolant flow controller",
        "summary": "Controls the hottest cooling channel or coldest heating channel with hysteresis.",
        "details": [
          "Block type: battery-coolant-controller.",
          "2 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Coolant flow controller",
          "caption": "Controls the hottest cooling channel or coldest heating channel with hysteresis."
        },
        "inputs": [
          {
            "id": "temperature",
            "label": "Cell temperatures",
            "quantity": "temperature",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "enable",
            "label": "Enable",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "command",
            "label": "Coolant flow request",
            "quantity": "mass-rate",
            "shape": [],
            "elementType": "real",
            "unit": "kg/s",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Mass flow",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "active",
            "label": "Active",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"cells\":3,\"onK\":310,\"offK\":305,\"command\":0.1}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-coolant-controller/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-current-monitor",
      "namespace": "signal",
      "slug": "signal-block-battery-current-monitor",
      "canonicalSlug": "battery-current-monitor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Battery current monitor",
        "label": "Battery current monitor",
        "summary": "Reports each channel below/above its bounds and a combined fault.",
        "details": [
          "Block type: battery-current-monitor.",
          "1 declared input and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "signal → bounds → fault",
          "label": "Compare monitored channels",
          "caption": "Reports each channel below/above its bounds and a combined fault."
        },
        "inputs": [
          {
            "id": "values",
            "label": "Channel measurements",
            "quantity": "current",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "low",
            "label": "Below lower bound",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "bool"
          },
          {
            "id": "high",
            "label": "Above upper bound",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "bool"
          },
          {
            "id": "fault",
            "label": "Any fault",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"cells\":3,\"lower\":-2,\"upper\":3}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-cycle-program",
      "namespace": "signal",
      "slug": "signal-block-battery-cycle-program",
      "canonicalSlug": "battery-cycle-program",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Battery cycle program",
        "label": "Battery cycle program",
        "summary": "Native rest/CC/CV phase sequencer with repeats, voltage interlocks and taper dwell. Commands use discharge-positive current.",
        "details": [
          "Block type: battery-cycle-program.",
          "4 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Battery cycle program",
          "caption": "Native rest/CC/CV phase sequencer with repeats, voltage interlocks and taper dwell. Commands use discharge-positive current."
        },
        "inputs": [
          {
            "id": "voltage",
            "label": "Measured terminal voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "current",
            "label": "Measured signed current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "trigger",
            "label": "Start trigger",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "enable",
            "label": "Enable",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "request",
            "label": "Signed current request",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "done",
            "label": "Program complete",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "phase",
            "label": "Zero-based active phase",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "elapsed",
            "label": "Phase elapsed time (s)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "cycles",
            "label": "Finished cycles",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "fault",
            "label": "Voltage interlock fault",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":0.1,\"repeats\":1,\"minimumV\":2.5,\"maximumV\":4.3,\"steps\":[[0,0,0,1,0,0,0],[1,1,3,2,0,0,0],[0,0,0,1,0,0,0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-cycle-program/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-discharge-envelope",
      "namespace": "signal",
      "slug": "signal-block-battery-discharge-envelope",
      "canonicalSlug": "battery-discharge-envelope",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Discharge-current envelope",
        "label": "Discharge-current envelope",
        "summary": "Selects the most restrictive cell voltage and temperature current limit.",
        "details": [
          "Block type: battery-discharge-envelope.",
          "3 declared inputs and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Discharge-current envelope",
          "caption": "Selects the most restrictive cell voltage and temperature current limit."
        },
        "inputs": [
          {
            "id": "voltage",
            "label": "Cell voltages",
            "quantity": "voltage",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "temperature",
            "label": "Cell temperatures",
            "quantity": "temperature",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "enable",
            "label": "Enable",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "limit",
            "label": "Allowed current magnitude",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltageLimit",
            "label": "Voltage limit",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "temperatureLimit",
            "label": "Temperature limit",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"cells\":3,\"nominalA\":4,\"voltageTable\":[[3,0],[3.2,4]],\"temperatureTable\":[[273.15,0],[283.15,4],[313.15,4],[323.15,0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-discharge-envelope/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-ecm-cell",
      "namespace": "signal",
      "slug": "signal-block-battery-ecm-cell",
      "canonicalSlug": "battery-ecm-cell",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Electrothermal ECM cell",
        "label": "Electrothermal ECM cell",
        "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
        "details": [
          "Block type: battery-ecm-cell.",
          "3 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "I → SOC, RC → V, T",
          "label": "Equivalent-circuit cell",
          "caption": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Signed cell current (discharge positive)",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "ambient",
            "label": "Ambient temperature",
            "quantity": "temperature",
            "shape": [],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "externalHeat",
            "label": "External heat flow",
            "quantity": "heat",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "label": "Terminal voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "soc",
            "label": "State of charge",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "temperature",
            "label": "Cell temperature",
            "quantity": "temperature",
            "shape": [],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "loss",
            "label": "Irreversible heat",
            "quantity": "heat",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "ocv",
            "label": "Open-circuit voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "inRange",
            "label": "SOC in characterized range",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"capacityAh\":5,\"resistanceOhm\":0.01,\"r1Ohm\":0.02,\"c1F\":500,\"r2Ohm\":0.01,\"c2F\":2000,\"heatCapacityJPerK\":100,\"conductanceWPerK\":1,\"initialSoc\":0.8,\"initialTemperatureK\":298.15,\"ocvTable\":[[0,3.7],[1,3.7]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/",
        "related": [
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-energy-counter",
      "namespace": "signal",
      "slug": "signal-block-battery-energy-counter",
      "canonicalSlug": "battery-energy-counter",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Energy counter",
        "label": "Energy counter",
        "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
        "details": [
          "Block type: battery-energy-counter.",
          "2 declared inputs and 4 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Energy counter",
          "caption": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately."
        },
        "inputs": [
          {
            "id": "rate",
            "label": "Signed battery power",
            "quantity": "power",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "State of energy",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "throughput",
            "label": "Net throughput (J)",
            "quantity": "energy",
            "shape": [],
            "elementType": "real",
            "unit": "J",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Energy",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "revaluation",
            "label": "Capacity revaluation (J)",
            "quantity": "energy",
            "shape": [],
            "elementType": "real",
            "unit": "J",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Energy",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "boundary",
            "label": "Boundary amount (J)",
            "quantity": "energy",
            "shape": [],
            "elementType": "real",
            "unit": "J",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Energy",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.8,\"chargeEfficiency\":1}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-energy-counter/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-fault-qualifier",
      "namespace": "signal",
      "slug": "signal-block-battery-fault-qualifier",
      "canonicalSlug": "battery-fault-qualifier",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Fault qualification timer",
        "label": "Fault qualification timer",
        "summary": "Qualifies persistent symptoms, leaks intermittent evidence and clears after a healthy interval.",
        "details": [
          "Block type: battery-fault-qualifier.",
          "2 declared inputs and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Fault qualification timer",
          "caption": "Qualifies persistent symptoms, leaks intermittent evidence and clears after a healthy interval."
        },
        "inputs": [
          {
            "id": "symptom",
            "label": "Fault symptom",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "fault",
            "label": "Qualified fault",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "accumulator",
            "label": "Symptom time (s)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "healthy",
            "label": "Healthy time (s)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":0.1,\"qualifyS\":0.3,\"decrementS\":0.1,\"clearS\":0.2}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-fault-qualifier/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-fuel-cell-table",
      "namespace": "signal",
      "slug": "signal-block-battery-fuel-cell-table",
      "canonicalSlug": "battery-fuel-cell-table",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Tabulated fuel-cell stack",
        "label": "Tabulated fuel-cell stack",
        "summary": "Interpolated polarization table with explicit out-of-table diagnostic.",
        "details": [
          "Block type: battery-fuel-cell-table.",
          "1 declared input and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Tabulated fuel-cell stack",
          "caption": "Interpolated polarization table with explicit out-of-table diagnostic."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Stack current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "label": "Stack voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "power",
            "label": "Stack power",
            "quantity": "power",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "inRange",
            "label": "Current in table range",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"voltageTable\":[[0,5],[1,4.8],[2,4.4]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-fuel-cell-table/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-heater-controller",
      "namespace": "signal",
      "slug": "signal-block-battery-heater-controller",
      "canonicalSlug": "battery-heater-controller",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Battery heater controller",
        "label": "Battery heater controller",
        "summary": "Controls the hottest cooling channel or coldest heating channel with hysteresis.",
        "details": [
          "Block type: battery-heater-controller.",
          "2 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Battery heater controller",
          "caption": "Controls the hottest cooling channel or coldest heating channel with hysteresis."
        },
        "inputs": [
          {
            "id": "temperature",
            "label": "Cell temperatures",
            "quantity": "temperature",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "enable",
            "label": "Enable",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "command",
            "label": "Heater power request",
            "quantity": "power",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "active",
            "label": "Active",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"cells\":3,\"onK\":280,\"offK\":285,\"command\":10}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-heater-controller/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-incremental-cccv",
      "namespace": "signal",
      "slug": "signal-block-battery-incremental-cccv",
      "canonicalSlug": "battery-incremental-cccv",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Incremental CC-CV controller",
        "label": "Incremental CC-CV controller",
        "summary": "Updates a bounded charge request from voltage error each sample.",
        "details": [
          "Block type: battery-incremental-cccv.",
          "3 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Incremental CC-CV controller",
          "caption": "Updates a bounded charge request from voltage error each sample."
        },
        "inputs": [
          {
            "id": "voltage",
            "label": "Highest cell voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "limit",
            "label": "Charge-current magnitude limit",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "enable",
            "label": "Enable",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "request",
            "label": "Signed current request (charge negative)",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "mode",
            "label": "Mode (0 disabled, 1 CC, 2 CV)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":0.1,\"targetV\":4,\"kp\":5,\"ki\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-incremental-cccv/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-module",
      "namespace": "signal",
      "slug": "signal-block-battery-module",
      "canonicalSlug": "battery-module",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Battery module",
        "label": "Battery module",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "details": [
          "Block type: battery-module.",
          "3 declared inputs and 8 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Battery module",
          "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Signed pack current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "ambient",
            "label": "Cell ambient temperatures",
            "quantity": "temperature",
            "shape": [
              6
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 6",
            "elementLabel": "real"
          },
          {
            "id": "externalHeat",
            "label": "External cell heat inputs",
            "quantity": "heat",
            "shape": [
              6
            ],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Array 6",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "label": "Pack terminal voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "cellVoltage",
            "label": "Individual cell voltages",
            "quantity": "voltage",
            "shape": [
              6
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 6",
            "elementLabel": "real"
          },
          {
            "id": "cellCurrent",
            "label": "Individual cell currents",
            "quantity": "current",
            "shape": [
              6
            ],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Array 6",
            "elementLabel": "real"
          },
          {
            "id": "cellSoc",
            "label": "Individual cell SOC",
            "quantity": "fraction",
            "shape": [
              6
            ],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Array 6",
            "elementLabel": "real"
          },
          {
            "id": "cellTemperature",
            "label": "Individual cell temperatures",
            "quantity": "temperature",
            "shape": [
              6
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 6",
            "elementLabel": "real"
          },
          {
            "id": "cellHeat",
            "label": "Individual cell heat generation",
            "quantity": "heat",
            "shape": [
              6
            ],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Array 6",
            "elementLabel": "real"
          },
          {
            "id": "nodeVoltage",
            "label": "Hierarchy node voltages",
            "quantity": "voltage",
            "shape": [
              10
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 10",
            "elementLabel": "real"
          },
          {
            "id": "nodeCurrent",
            "label": "Hierarchy node currents",
            "quantity": "current",
            "shape": [
              10
            ],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Array 10",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"parallelCells\":2,\"seriesGroups\":3,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-module/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-module-assembly",
      "namespace": "signal",
      "slug": "signal-block-battery-module-assembly",
      "canonicalSlug": "battery-module-assembly",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Module assembly",
        "label": "Module assembly",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "details": [
          "Block type: battery-module-assembly.",
          "3 declared inputs and 8 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Module assembly",
          "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Signed pack current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "ambient",
            "label": "Cell ambient temperatures",
            "quantity": "temperature",
            "shape": [
              12
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 12",
            "elementLabel": "real"
          },
          {
            "id": "externalHeat",
            "label": "External cell heat inputs",
            "quantity": "heat",
            "shape": [
              12
            ],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Array 12",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "label": "Pack terminal voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "cellVoltage",
            "label": "Individual cell voltages",
            "quantity": "voltage",
            "shape": [
              12
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 12",
            "elementLabel": "real"
          },
          {
            "id": "cellCurrent",
            "label": "Individual cell currents",
            "quantity": "current",
            "shape": [
              12
            ],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Array 12",
            "elementLabel": "real"
          },
          {
            "id": "cellSoc",
            "label": "Individual cell SOC",
            "quantity": "fraction",
            "shape": [
              12
            ],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Array 12",
            "elementLabel": "real"
          },
          {
            "id": "cellTemperature",
            "label": "Individual cell temperatures",
            "quantity": "temperature",
            "shape": [
              12
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 12",
            "elementLabel": "real"
          },
          {
            "id": "cellHeat",
            "label": "Individual cell heat generation",
            "quantity": "heat",
            "shape": [
              12
            ],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Array 12",
            "elementLabel": "real"
          },
          {
            "id": "nodeVoltage",
            "label": "Hierarchy node voltages",
            "quantity": "voltage",
            "shape": [
              21
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 21",
            "elementLabel": "real"
          },
          {
            "id": "nodeCurrent",
            "label": "Hierarchy node currents",
            "quantity": "current",
            "shape": [
              21
            ],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Array 21",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"parallelCells\":2,\"seriesGroups\":3,\"modules\":2,\"moduleConnection\":0,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-module-assembly/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-pack-assembly",
      "namespace": "signal",
      "slug": "signal-block-battery-pack-assembly",
      "canonicalSlug": "battery-pack-assembly",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Battery pack assembly",
        "label": "Battery pack assembly",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "details": [
          "Block type: battery-pack-assembly.",
          "3 declared inputs and 8 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Battery pack assembly",
          "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Signed pack current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "ambient",
            "label": "Cell ambient temperatures",
            "quantity": "temperature",
            "shape": [
              24
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 24",
            "elementLabel": "real"
          },
          {
            "id": "externalHeat",
            "label": "External cell heat inputs",
            "quantity": "heat",
            "shape": [
              24
            ],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Array 24",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "label": "Pack terminal voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "cellVoltage",
            "label": "Individual cell voltages",
            "quantity": "voltage",
            "shape": [
              24
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 24",
            "elementLabel": "real"
          },
          {
            "id": "cellCurrent",
            "label": "Individual cell currents",
            "quantity": "current",
            "shape": [
              24
            ],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Array 24",
            "elementLabel": "real"
          },
          {
            "id": "cellSoc",
            "label": "Individual cell SOC",
            "quantity": "fraction",
            "shape": [
              24
            ],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Array 24",
            "elementLabel": "real"
          },
          {
            "id": "cellTemperature",
            "label": "Individual cell temperatures",
            "quantity": "temperature",
            "shape": [
              24
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 24",
            "elementLabel": "real"
          },
          {
            "id": "cellHeat",
            "label": "Individual cell heat generation",
            "quantity": "heat",
            "shape": [
              24
            ],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Array 24",
            "elementLabel": "real"
          },
          {
            "id": "nodeVoltage",
            "label": "Hierarchy node voltages",
            "quantity": "voltage",
            "shape": [
              43
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 43",
            "elementLabel": "real"
          },
          {
            "id": "nodeCurrent",
            "label": "Hierarchy node currents",
            "quantity": "current",
            "shape": [
              43
            ],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Array 43",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"parallelCells\":2,\"seriesGroups\":3,\"modules\":2,\"moduleConnection\":0,\"seriesAssemblies\":1,\"parallelStrings\":2,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-pack-assembly/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-pack-soc-adaptive-ekf",
      "namespace": "signal",
      "slug": "signal-block-battery-pack-soc-adaptive-ekf",
      "canonicalSlug": "battery-pack-soc-adaptive-ekf",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Pack-average SOC adaptive EKF",
        "label": "Pack-average SOC adaptive EKF",
        "summary": "Homogeneous series-cell average observer. Voltage, resistance and observation slope scale by series count; output is an average, not individual cell SOC.",
        "details": [
          "Block type: battery-pack-soc-adaptive-ekf.",
          "4 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "predict → innovation → update",
          "label": "Pack-average SOC adaptive EKF",
          "caption": "Homogeneous series-cell average observer. Voltage, resistance and observation slope scale by series count; output is an average, not individual cell SOC."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Series pack current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltage",
            "label": "Measured pack voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Voltage valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "Average SOC",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Average SOC variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Pack voltage innovation",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "noise",
            "label": "Pack voltage-noise variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Observer status",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.75,\"initialVariance\":0.01,\"processNoise\":0,\"measurementNoise\":0.04,\"resistanceOhm\":0.05,\"adaptationRate\":0.1,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]],\"seriesCells\":4}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-pack-soc-adaptive-ekf/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-pack-soc-ekf",
      "namespace": "signal",
      "slug": "signal-block-battery-pack-soc-ekf",
      "canonicalSlug": "battery-pack-soc-ekf",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Pack-average SOC EKF",
        "label": "Pack-average SOC EKF",
        "summary": "Homogeneous series-cell average observer. Voltage, resistance and observation slope scale by series count; output is an average, not individual cell SOC.",
        "details": [
          "Block type: battery-pack-soc-ekf.",
          "4 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "predict → innovation → update",
          "label": "Pack-average SOC EKF",
          "caption": "Homogeneous series-cell average observer. Voltage, resistance and observation slope scale by series count; output is an average, not individual cell SOC."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Series pack current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltage",
            "label": "Measured pack voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Voltage valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "Average SOC",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Average SOC variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Pack voltage innovation",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "noise",
            "label": "Pack voltage-noise variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Observer status",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.75,\"initialVariance\":0.01,\"processNoise\":0,\"measurementNoise\":0.04,\"resistanceOhm\":0.05,\"adaptationRate\":0,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]],\"seriesCells\":4}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-pack-soc-ekf/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-parallel-group",
      "namespace": "signal",
      "slug": "signal-block-battery-parallel-group",
      "canonicalSlug": "battery-parallel-group",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Parallel cell group",
        "label": "Parallel cell group",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "details": [
          "Block type: battery-parallel-group.",
          "3 declared inputs and 8 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Parallel cell group",
          "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Signed pack current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "ambient",
            "label": "Cell ambient temperatures",
            "quantity": "temperature",
            "shape": [
              2
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          },
          {
            "id": "externalHeat",
            "label": "External cell heat inputs",
            "quantity": "heat",
            "shape": [
              2
            ],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "label": "Pack terminal voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "cellVoltage",
            "label": "Individual cell voltages",
            "quantity": "voltage",
            "shape": [
              2
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          },
          {
            "id": "cellCurrent",
            "label": "Individual cell currents",
            "quantity": "current",
            "shape": [
              2
            ],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          },
          {
            "id": "cellSoc",
            "label": "Individual cell SOC",
            "quantity": "fraction",
            "shape": [
              2
            ],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          },
          {
            "id": "cellTemperature",
            "label": "Individual cell temperatures",
            "quantity": "temperature",
            "shape": [
              2
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          },
          {
            "id": "cellHeat",
            "label": "Individual cell heat generation",
            "quantity": "heat",
            "shape": [
              2
            ],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          },
          {
            "id": "nodeVoltage",
            "label": "Hierarchy node voltages",
            "quantity": "voltage",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "nodeCurrent",
            "label": "Hierarchy node currents",
            "quantity": "current",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"parallelCells\":2,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-parallel-group/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-passive-balancer",
      "namespace": "signal",
      "slug": "signal-block-battery-passive-balancer",
      "canonicalSlug": "battery-passive-balancer",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Passive cell balancer",
        "label": "Passive cell balancer",
        "summary": "Hysteresis selects high cells and reports bleed current and resistor heat.",
        "details": [
          "Block type: battery-passive-balancer.",
          "2 declared inputs and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Passive cell balancer",
          "caption": "Hysteresis selects high cells and reports bleed current and resistor heat."
        },
        "inputs": [
          {
            "id": "voltage",
            "label": "Cell voltages",
            "quantity": "voltage",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "enable",
            "label": "Enable",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "active",
            "label": "Bleed switches",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "bool"
          },
          {
            "id": "current",
            "label": "Bleed currents",
            "quantity": "current",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "heat",
            "label": "Bleed power",
            "quantity": "power",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"cells\":3,\"onDeltaV\":0.02,\"offDeltaV\":0.01,\"resistanceOhm\":40,\"minVoltageV\":3}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-passive-balancer/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-pem-stack",
      "namespace": "signal",
      "slug": "signal-block-battery-pem-stack",
      "canonicalSlug": "battery-pem-stack",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Reduced PEM fuel-cell stack",
        "label": "Reduced PEM fuel-cell stack",
        "summary": "Prescribed gas/temperature Nernst potential with activation, ohmic and limiting-current losses plus an identified polarization lag. No humidity, gas-flow or thermal network states.",
        "details": [
          "Block type: battery-pem-stack.",
          "4 declared inputs and 9 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Reduced PEM fuel-cell stack",
          "caption": "Prescribed gas/temperature Nernst potential with activation, ohmic and limiting-current losses plus an identified polarization lag. No humidity, gas-flow or thermal network states."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Stack current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "temperature",
            "label": "Cell temperature",
            "quantity": "temperature",
            "shape": [],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "hydrogenPressure",
            "label": "Hydrogen partial pressure",
            "quantity": "pressure",
            "shape": [],
            "elementType": "real",
            "unit": "Pa",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Pressure",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "oxygenPressure",
            "label": "Oxygen partial pressure",
            "quantity": "pressure",
            "shape": [],
            "elementType": "real",
            "unit": "Pa",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Pressure",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "label": "Stack voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "power",
            "label": "Electrical output power",
            "quantity": "power",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "heat",
            "label": "Thermoneutral power difference",
            "quantity": "heat",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "hydrogen",
            "label": "Hydrogen consumption (mol/s)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "oxygen",
            "label": "Oxygen consumption (mol/s)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "reversible",
            "label": "Per-cell reversible voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "polarization",
            "label": "Per-cell polarization state",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "activationTarget",
            "label": "Steady activation loss",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "concentration",
            "label": "Concentration loss",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"seriesCells\":5,\"reversibleV\":1.229,\"temperatureSlopeVPerK\":-0.00085,\"referenceTemperatureK\":298.15,\"referencePressurePa\":100000,\"waterActivity\":1,\"resistanceOhm\":0.01,\"exchangeCurrentA\":1,\"limitingCurrentA\":20,\"transferCoefficient\":0.5,\"timeConstantS\":1,\"initialPolarizationV\":0,\"thermoneutralV\":1.48}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-pem-stack/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-power-capability",
      "namespace": "signal",
      "slug": "signal-block-battery-power-capability",
      "canonicalSlug": "battery-power-capability",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Pulse power capability",
        "label": "Pulse power capability",
        "summary": "Quasi-static voltage/current/SOC envelope for an explicit prediction horizon.",
        "details": [
          "Block type: battery-power-capability.",
          "3 declared inputs and 4 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Pulse power capability",
          "caption": "Quasi-static voltage/current/SOC envelope for an explicit prediction horizon."
        },
        "inputs": [
          {
            "id": "ocv",
            "label": "Open-circuit voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "resistance",
            "label": "Effective pulse resistance (ohm)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "soc",
            "label": "State of charge",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "discharge",
            "label": "Discharge-current limit",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "charge",
            "label": "Charge-current magnitude limit",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "dischargePower",
            "label": "Discharge power",
            "quantity": "power",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "chargePower",
            "label": "Charge power",
            "quantity": "power",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"capacityAh\":2,\"horizonS\":60,\"minVoltageV\":3,\"maxVoltageV\":4.2,\"maxDischargeA\":5,\"maxChargeA\":3,\"minSoc\":0.2,\"maxSoc\":0.8}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-power-capability/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-resistance-health",
      "namespace": "signal",
      "slug": "signal-block-battery-resistance-health",
      "canonicalSlug": "battery-resistance-health",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Resistance health index",
        "label": "Resistance health index",
        "summary": "Endpoint-normalized health index with raw value and out-of-reference flag.",
        "details": [
          "Block type: battery-resistance-health.",
          "1 declared input and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Resistance health index",
          "caption": "Endpoint-normalized health index with raw value and out-of-reference flag."
        },
        "inputs": [
          {
            "id": "measurement",
            "label": "Measured resistance (ohm)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "health",
            "label": "Clipped health index",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "raw",
            "label": "Unclipped index",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "outside",
            "label": "Outside reference range",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"fresh\":0.05,\"end\":0.1}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-resistance-health/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-single-particle-cell",
      "namespace": "signal",
      "slug": "signal-block-battery-single-particle-cell",
      "canonicalSlug": "battery-single-particle-cell",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Single-particle cell",
        "label": "Single-particle cell",
        "summary": "Native spherical solid diffusion and Butler-Volmer kinetics with tabulated electrode OCPs. Isothermal material parameters; no electrolyte transport, aging or conserving adapter.",
        "details": [
          "Block type: battery-single-particle-cell.",
          "2 declared inputs and 8 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "diffusion → kinetics → V",
          "label": "Single-particle cell",
          "caption": "Native spherical solid diffusion and Butler-Volmer kinetics with tabulated electrode OCPs. Isothermal material parameters; no electrolyte transport, aging or conserving adapter."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Signed cell current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "temperature",
            "label": "Kinetics temperature",
            "quantity": "temperature",
            "shape": [],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "label": "Terminal voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "socNegative",
            "label": "Negative-window SOC",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "socPositive",
            "label": "Positive-window SOC",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "surfaceNegative",
            "label": "Negative surface stoichiometry",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "surfacePositive",
            "label": "Positive surface stoichiometry",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "lithium",
            "label": "Solid lithium inventory (mol)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "concentrationNegative",
            "label": "Negative shell concentrations (mol/m³)",
            "quantity": "dimensionless",
            "shape": [
              8
            ],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 8",
            "elementLabel": "real"
          },
          {
            "id": "concentrationPositive",
            "label": "Positive shell concentrations (mol/m³)",
            "quantity": "dimensionless",
            "shape": [
              8
            ],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 8",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"shells\":8,\"areaM2\":0.01,\"resistanceOhm\":0.01,\"initialSoc\":0.5,\"negative\":[0.000005,0.0001,0.5,30000,1e-13,2,0.1,0.9],\"positive\":[0.000005,0.0001,0.5,30000,1e-13,2,0.9,0.1],\"negativeOcp\":[[0,0.1],[1,0.1]],\"positiveOcp\":[[0,4.1],[1,4.1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-single-particle-cell/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-soc-adaptive-ekf",
      "namespace": "signal",
      "slug": "signal-block-battery-soc-adaptive-ekf",
      "canonicalSlug": "battery-soc-adaptive-ekf",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "SOC adaptive EKF",
        "label": "SOC adaptive EKF",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
        "details": [
          "Block type: battery-soc-adaptive-ekf.",
          "4 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "predict → innovation → update",
          "label": "SOC adaptive EKF",
          "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Signed battery current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltage",
            "label": "Measured voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Voltage measurement valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "State of charge",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Posterior fraction variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Voltage innovation",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "noise",
            "label": "Voltage-noise variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0.1,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soc-adaptive-ekf/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-soc-adaptive-ekf-variable-capacity",
      "namespace": "signal",
      "slug": "signal-block-battery-soc-adaptive-ekf-variable-capacity",
      "canonicalSlug": "battery-soc-adaptive-ekf-variable-capacity",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "SOC adaptive EKF with capacity input",
        "label": "SOC adaptive EKF with capacity input",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
        "details": [
          "Block type: battery-soc-adaptive-ekf-variable-capacity.",
          "5 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "predict → innovation → update",
          "label": "SOC adaptive EKF with capacity input",
          "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Signed battery current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltage",
            "label": "Measured voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Voltage measurement valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "capacity",
            "label": "Charge capacity (Ah)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "State of charge",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Posterior fraction variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Voltage innovation",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "noise",
            "label": "Voltage-noise variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0.1,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soc-adaptive-ekf-variable-capacity/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-soc-ekf",
      "namespace": "signal",
      "slug": "signal-block-battery-soc-ekf",
      "canonicalSlug": "battery-soc-ekf",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "SOC EKF",
        "label": "SOC EKF",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
        "details": [
          "Block type: battery-soc-ekf.",
          "4 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "predict → innovation → update",
          "label": "SOC EKF",
          "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Signed battery current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltage",
            "label": "Measured voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Voltage measurement valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "State of charge",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Posterior fraction variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Voltage innovation",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "noise",
            "label": "Voltage-noise variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soc-ekf/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-soc-ekf-variable-capacity",
      "namespace": "signal",
      "slug": "signal-block-battery-soc-ekf-variable-capacity",
      "canonicalSlug": "battery-soc-ekf-variable-capacity",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "SOC EKF with capacity input",
        "label": "SOC EKF with capacity input",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
        "details": [
          "Block type: battery-soc-ekf-variable-capacity.",
          "5 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "predict → innovation → update",
          "label": "SOC EKF with capacity input",
          "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Signed battery current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltage",
            "label": "Measured voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Voltage measurement valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "capacity",
            "label": "Charge capacity (Ah)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "State of charge",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Posterior fraction variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Voltage innovation",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "noise",
            "label": "Voltage-noise variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soc-ekf-variable-capacity/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-soe-adaptive-ekf",
      "namespace": "signal",
      "slug": "signal-block-battery-soe-adaptive-ekf",
      "canonicalSlug": "battery-soe-adaptive-ekf",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "SOE adaptive EKF",
        "label": "SOE adaptive EKF",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
        "details": [
          "Block type: battery-soe-adaptive-ekf.",
          "5 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "predict → innovation → update",
          "label": "SOE adaptive EKF",
          "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance."
        },
        "inputs": [
          {
            "id": "power",
            "label": "Signed battery power",
            "quantity": "power",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "current",
            "label": "Signed battery current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltage",
            "label": "Measured voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Voltage measurement valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "State of energy",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Posterior fraction variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Voltage innovation",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "noise",
            "label": "Voltage-noise variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0.1,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soe-adaptive-ekf/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-soe-adaptive-ekf-variable-capacity",
      "namespace": "signal",
      "slug": "signal-block-battery-soe-adaptive-ekf-variable-capacity",
      "canonicalSlug": "battery-soe-adaptive-ekf-variable-capacity",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "SOE adaptive EKF with capacity input",
        "label": "SOE adaptive EKF with capacity input",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
        "details": [
          "Block type: battery-soe-adaptive-ekf-variable-capacity.",
          "6 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "predict → innovation → update",
          "label": "SOE adaptive EKF with capacity input",
          "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance."
        },
        "inputs": [
          {
            "id": "power",
            "label": "Signed battery power",
            "quantity": "power",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "current",
            "label": "Signed battery current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltage",
            "label": "Measured voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Voltage measurement valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "capacity",
            "label": "Energy capacity (J)",
            "quantity": "energy",
            "shape": [],
            "elementType": "real",
            "unit": "J",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Energy",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "State of energy",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Posterior fraction variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Voltage innovation",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "noise",
            "label": "Voltage-noise variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0.1,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soe-adaptive-ekf-variable-capacity/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-soe-ekf",
      "namespace": "signal",
      "slug": "signal-block-battery-soe-ekf",
      "canonicalSlug": "battery-soe-ekf",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "SOE EKF",
        "label": "SOE EKF",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
        "details": [
          "Block type: battery-soe-ekf.",
          "5 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "predict → innovation → update",
          "label": "SOE EKF",
          "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity."
        },
        "inputs": [
          {
            "id": "power",
            "label": "Signed battery power",
            "quantity": "power",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "current",
            "label": "Signed battery current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltage",
            "label": "Measured voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Voltage measurement valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "State of energy",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Posterior fraction variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Voltage innovation",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "noise",
            "label": "Voltage-noise variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soe-ekf/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-soe-ekf-variable-capacity",
      "namespace": "signal",
      "slug": "signal-block-battery-soe-ekf-variable-capacity",
      "canonicalSlug": "battery-soe-ekf-variable-capacity",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "SOE EKF with capacity input",
        "label": "SOE EKF with capacity input",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
        "details": [
          "Block type: battery-soe-ekf-variable-capacity.",
          "6 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "predict → innovation → update",
          "label": "SOE EKF with capacity input",
          "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity."
        },
        "inputs": [
          {
            "id": "power",
            "label": "Signed battery power",
            "quantity": "power",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "current",
            "label": "Signed battery current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "voltage",
            "label": "Measured voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Voltage measurement valid",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "capacity",
            "label": "Energy capacity (J)",
            "quantity": "energy",
            "shape": [],
            "elementType": "real",
            "unit": "J",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Energy",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "State of energy",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "variance",
            "label": "Posterior fraction variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "innovation",
            "label": "Voltage innovation",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "gain",
            "label": "Correction gain",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "noise",
            "label": "Voltage-noise variance",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soe-ekf-variable-capacity/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-state-space-impedance",
      "namespace": "signal",
      "slug": "signal-block-battery-state-space-impedance",
      "canonicalSlug": "battery-state-space-impedance",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "State-space impedance",
        "label": "State-space impedance",
        "summary": "Continuous current-to-voltage linear dynamics with direct feedthrough. User supplies identified matrices.",
        "details": [
          "Block type: battery-state-space-impedance.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "State-space impedance",
          "caption": "Continuous current-to-voltage linear dynamics with direct feedthrough. User supplies identified matrices."
        },
        "inputs": [
          {
            "id": "input",
            "label": "Current inputs",
            "quantity": "current",
            "shape": [
              1
            ],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "output",
            "label": "Voltage outputs",
            "quantity": "voltage",
            "shape": [
              1
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"A\":[[-0.1]],\"B\":[[0.005]],\"C\":[[1]],\"D\":[[0.01]],\"initial\":[0]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-state-space-impedance/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-supercapacitor",
      "namespace": "signal",
      "slug": "signal-block-battery-supercapacitor",
      "canonicalSlug": "battery-supercapacitor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Supercapacitor cell",
        "label": "Supercapacitor cell",
        "summary": "Causal capacitor state with series loss, leakage and stored energy.",
        "details": [
          "Block type: battery-supercapacitor.",
          "1 declared input and 4 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Supercapacitor cell",
          "caption": "Causal capacitor state with series loss, leakage and stored energy."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Signed discharge current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "label": "Terminal voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "internalVoltage",
            "label": "Capacitor voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "energy",
            "label": "Stored energy",
            "quantity": "energy",
            "shape": [],
            "elementType": "real",
            "unit": "J",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Energy",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "loss",
            "label": "Dissipated heat",
            "quantity": "heat",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"capacitanceF\":100,\"resistanceOhm\":0.05,\"leakageSiemens\":0,\"initialVoltageV\":2.5}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-supercapacitor/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-tabulated-cell",
      "namespace": "signal",
      "slug": "signal-block-battery-tabulated-cell",
      "canonicalSlug": "battery-tabulated-cell",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Tabulated OCV cell",
        "label": "Tabulated OCV cell",
        "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
        "details": [
          "Block type: battery-tabulated-cell.",
          "3 declared inputs and 6 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "I → cell state → V, T",
          "label": "Tabulated electrical cell",
          "caption": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included."
        },
        "inputs": [
          {
            "id": "current",
            "label": "Signed cell current (discharge positive)",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "ambient",
            "label": "Ambient temperature",
            "quantity": "temperature",
            "shape": [],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "externalHeat",
            "label": "External heat flow",
            "quantity": "heat",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "voltage",
            "label": "Terminal voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "soc",
            "label": "State of charge",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "temperature",
            "label": "Cell temperature",
            "quantity": "temperature",
            "shape": [],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "loss",
            "label": "Irreversible heat",
            "quantity": "heat",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "ocv",
            "label": "Open-circuit voltage",
            "quantity": "voltage",
            "shape": [],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "inRange",
            "label": "SOC in characterized range",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"capacityAh\":5,\"resistanceOhm\":0.01,\"heatCapacityJPerK\":100,\"conductanceWPerK\":1,\"initialSoc\":0.8,\"initialTemperatureK\":298.15,\"ocvTable\":[[0,3.7],[1,3.7]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-tabulated-cell/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-temperature-monitor",
      "namespace": "signal",
      "slug": "signal-block-battery-temperature-monitor",
      "canonicalSlug": "battery-temperature-monitor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Battery temperature monitor",
        "label": "Battery temperature monitor",
        "summary": "Reports each channel below/above its bounds and a combined fault.",
        "details": [
          "Block type: battery-temperature-monitor.",
          "1 declared input and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "signal → bounds → fault",
          "label": "Compare monitored channels",
          "caption": "Reports each channel below/above its bounds and a combined fault."
        },
        "inputs": [
          {
            "id": "values",
            "label": "Channel measurements",
            "quantity": "temperature",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "low",
            "label": "Below lower bound",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "bool"
          },
          {
            "id": "high",
            "label": "Above upper bound",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "bool"
          },
          {
            "id": "fault",
            "label": "Any fault",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"cells\":3,\"lower\":273.15,\"upper\":318.15}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-thermal-state-space",
      "namespace": "signal",
      "slug": "signal-block-battery-thermal-state-space",
      "canonicalSlug": "battery-thermal-state-space",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Thermal state-space model",
        "label": "Thermal state-space model",
        "summary": "Linear thermal rise model with a positive diagonal heat-capacity descriptor. User supplies validated matrices.",
        "details": [
          "Block type: battery-thermal-state-space.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Thermal state-space model",
          "caption": "Linear thermal rise model with a positive diagonal heat-capacity descriptor. User supplies validated matrices."
        },
        "inputs": [
          {
            "id": "input",
            "label": "Heat inputs",
            "quantity": "heat",
            "shape": [
              2
            ],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "output",
            "label": "Temperature outputs",
            "quantity": "temperature",
            "shape": [
              2
            ],
            "elementType": "real",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"ambientK\":298.15,\"A\":[[-2,1],[1,-2]],\"B\":[[1,0],[0,1]],\"C\":[[1,0],[0,1]],\"D\":[[0,0],[0,0]],\"initial\":[0,0],\"capacityDiagonal\":[100,100]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-thermal-state-space/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-variable-charge-counter",
      "namespace": "signal",
      "slug": "signal-block-battery-variable-charge-counter",
      "canonicalSlug": "battery-variable-charge-counter",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Charge counter with capacity input",
        "label": "Charge counter with capacity input",
        "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
        "details": [
          "Block type: battery-variable-charge-counter.",
          "3 declared inputs and 4 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Charge counter with capacity input",
          "caption": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately."
        },
        "inputs": [
          {
            "id": "rate",
            "label": "Signed battery current",
            "quantity": "current",
            "shape": [],
            "elementType": "real",
            "unit": "A",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Current",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "capacity",
            "label": "Charge capacity (Ah)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "State of charge",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "throughput",
            "label": "Net throughput (C)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "revaluation",
            "label": "Capacity revaluation (C)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "boundary",
            "label": "Boundary amount (C)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.8,\"chargeEfficiency\":1}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-variable-charge-counter/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-variable-energy-counter",
      "namespace": "signal",
      "slug": "signal-block-battery-variable-energy-counter",
      "canonicalSlug": "battery-variable-energy-counter",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Energy counter with capacity input",
        "label": "Energy counter with capacity input",
        "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
        "details": [
          "Block type: battery-variable-energy-counter.",
          "3 declared inputs and 4 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Energy counter with capacity input",
          "caption": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately."
        },
        "inputs": [
          {
            "id": "rate",
            "label": "Signed battery power",
            "quantity": "power",
            "shape": [],
            "elementType": "real",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "reset",
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "id": "capacity",
            "label": "Energy capacity (J)",
            "quantity": "energy",
            "shape": [],
            "elementType": "real",
            "unit": "J",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Energy",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "fraction",
            "label": "State of energy",
            "quantity": "fraction",
            "shape": [],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "throughput",
            "label": "Net throughput (J)",
            "quantity": "energy",
            "shape": [],
            "elementType": "real",
            "unit": "J",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Energy",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "revaluation",
            "label": "Capacity revaluation (J)",
            "quantity": "energy",
            "shape": [],
            "elementType": "real",
            "unit": "J",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Energy",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "boundary",
            "label": "Boundary amount (J)",
            "quantity": "energy",
            "shape": [],
            "elementType": "real",
            "unit": "J",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Energy",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.8,\"chargeEfficiency\":1}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-variable-energy-counter/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-voltage-monitor",
      "namespace": "signal",
      "slug": "signal-block-battery-voltage-monitor",
      "canonicalSlug": "battery-voltage-monitor",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Battery voltage monitor",
        "label": "Battery voltage monitor",
        "summary": "Reports each channel below/above its bounds and a combined fault.",
        "details": [
          "Block type: battery-voltage-monitor.",
          "1 declared input and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "signal → bounds → fault",
          "label": "Compare monitored channels",
          "caption": "Reports each channel below/above its bounds and a combined fault."
        },
        "inputs": [
          {
            "id": "values",
            "label": "Channel measurements",
            "quantity": "voltage",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "V",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Voltage",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "low",
            "label": "Below lower bound",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "bool"
          },
          {
            "id": "high",
            "label": "Above upper bound",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "bool"
          },
          {
            "id": "fault",
            "label": "Any fault",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"cells\":3,\"lower\":3,\"upper\":4.2}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-voltage-monitor/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "battery-weighted-capacity-fit",
      "namespace": "signal",
      "slug": "signal-block-battery-weighted-capacity-fit",
      "canonicalSlug": "battery-weighted-capacity-fit",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Weighted capacity fit",
        "label": "Weighted capacity fit",
        "summary": "Fits charge capacity through the origin from aligned SOC-change and integrated-charge windows.",
        "details": [
          "Block type: battery-weighted-capacity-fit.",
          "3 declared inputs and 5 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "battery",
          "symbol": "battery signals → operation",
          "label": "Weighted capacity fit",
          "caption": "Fits charge capacity through the origin from aligned SOC-change and integrated-charge windows."
        },
        "inputs": [
          {
            "id": "socChange",
            "label": "SOC decrease per window",
            "quantity": "fraction",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "0–1",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Fraction",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "charge",
            "label": "Removed charge per window (Ah)",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "id": "weight",
            "label": "Window weights",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "capacity",
            "label": "Fitted capacity (Ah)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "information",
            "label": "Weighted SOC information",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "residual",
            "label": "Weighted squared residual (Ah²)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "count",
            "label": "Included windows",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "valid",
            "label": "Positive identifiable capacity",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "configuration",
            "label": "Configuration",
            "unit": "",
            "value": "{\"windows\":3,\"minimumInformation\":1e-12}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-weighted-capacity-fit/",
        "related": [
          {
            "label": "Battery ecm cell",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
          },
          {
            "label": "Battery current monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
          },
          {
            "label": "Battery temperature monitor",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "boolean-latch",
      "namespace": "signal",
      "slug": "signal-block-boolean-latch",
      "canonicalSlug": "signal-block-boolean-latch",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Boolean latch",
        "label": "Boolean latch",
        "summary": "Sampled set/reset memory. SET wins when both inputs are 1; holds when both are 0. Inputs must be exactly 0 or 1.",
        "details": [
          "Block type: boolean-latch.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Sampled set/reset memory. SET wins when both inputs are 1; holds when both are 0. Inputs must be exactly 0 or 1."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Set (0 or 1)",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "Reset (0 or 1)",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "sampleTimeS",
            "label": "Sample time",
            "unit": "s",
            "value": "0.01"
          },
          {
            "id": "initial",
            "label": "Initial output (0 or 1)",
            "unit": "",
            "value": "0"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "bus-assign",
      "namespace": "signal",
      "slug": "signal-block-bus-assign",
      "canonicalSlug": "bus-assign",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Bus assignment",
        "label": "Bus assignment",
        "summary": "Replace selected fields while preserving the original typed bus.",
        "details": [
          "Block type: bus-assign.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Replace selected fields while preserving the original typed bus."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-assign/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "bus-create",
      "namespace": "signal",
      "slug": "signal-block-bus-create",
      "canonicalSlug": "bus-create",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Bus creator",
        "label": "Bus creator",
        "summary": "Pack named typed signals without changing their numerical values.",
        "details": [
          "Block type: bus-create.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Pack named typed signals without changing their numerical values."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/",
        "related": [
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "bus-select",
      "namespace": "signal",
      "slug": "signal-block-bus-select",
      "canonicalSlug": "bus-select",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Bus selector",
        "label": "Bus selector",
        "summary": "Select a named field, including nested bus fields.",
        "details": [
          "Block type: bus-select.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Select a named field, including nested bus fields."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-select/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "bus-to-vector",
      "namespace": "signal",
      "slug": "signal-block-bus-to-vector",
      "canonicalSlug": "bus-to-vector",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Bus to vector",
        "label": "Bus to vector",
        "summary": "Flatten same-quantity scalar bus fields into an ordered vector.",
        "details": [
          "Block type: bus-to-vector.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Flatten same-quantity scalar bus fields into an ordered vector."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-to-vector/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "chart",
      "namespace": "signal",
      "slug": "signal-block-chart",
      "canonicalSlug": "signal-block-chart",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Chart",
        "label": "Chart",
        "summary": "Sampled parallel regions, ordered guards and named held outputs.",
        "details": [
          "Block type: chart.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "guard → state",
          "label": "Ordered state transitions",
          "caption": "Sampled parallel regions, ordered guards and named held outputs."
        },
        "inputs": [
          {
            "id": "command",
            "quantity": "dimensionless",
            "label": "command",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "mode",
            "quantity": "dimensionless",
            "initial": 0,
            "label": "mode",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "chart",
            "label": "Chart document",
            "unit": "",
            "value": "{\"format\":\"lemonergy/chart@1\",\"sampleTimeS\":0.02,\"inputs\":[{\"id\":\"command\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"id\":\"mode\",\"quantity\":\"dimensionless\",\"initial\":0}],\"regions\":[{\"id\":\"supervisor\",\"initial\":\"idle\",\"states\":[{\"id\":\"idle\",\"entry\":[{\"set\":\"mode\",\"to\":0}],\"exit\":[]},{\"id\":\"active\",\"entry\":[{\"set\":\"mode\",\"to\":1}],\"exit\":[]}],\"transitions\":[{\"from\":\"idle\",\"to\":\"active\",\"when\":{\"signal\":\"command\",\"op\":\">=\",\"value\":0.5}},{\"from\":\"active\",\"to\":\"idle\",\"when\":{\"signal\":\"command\",\"op\":\"<\",\"value\":0.5}}]}]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-chart/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "cold-gas-thruster",
      "namespace": "signal",
      "slug": "signal-block-cold-gas-thruster",
      "canonicalSlug": "signal-block-cold-gas-thruster",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Cold-gas thruster",
        "label": "Cold-gas thruster",
        "summary": "Nozzles firing × gas available × thrust per nozzle (mode 0, N), or the mass flow that thrust costs at the effective exhaust velocity (mode 1, kg/s). Thrust is per nozzle at the supplied state; a tank blow-down is composed upstream by scaling the nozzle count with a Power law of the gas left.",
        "details": [
          "Block type: cold-gas-thruster.",
          "2 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "physical-model",
          "symbol": "inputs → equation → response",
          "label": "Reduced vehicle equation",
          "caption": "Nozzles firing × gas available × thrust per nozzle (mode 0, N), or the mass flow that thrust costs at the effective exhaust velocity (mode 1, kg/s). Thrust is per nozzle at the supplied state; a tank blow-down is composed upstream by scaling the nozzle count with a Power law of the gas left."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Nozzles firing",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "Gas available (0 or 1)",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Thrust",
            "quantity": "force",
            "unit": "N",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Force",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "out1",
            "label": "Mass flow",
            "quantity": "mass-rate",
            "unit": "kg/s",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Mass flow",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "thrustPerNozzle",
            "label": "Thrust per nozzle",
            "unit": "N",
            "value": "10000"
          },
          {
            "id": "exhaustVelocity",
            "label": "Effective exhaust velocity",
            "unit": "m/s",
            "value": "500"
          },
          {
            "id": "mode",
            "label": "Output (0 thrust, 1 mass flow)",
            "unit": "",
            "value": "0"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-cold-gas-thruster/",
        "related": [
          {
            "label": "Road load",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-road-load/"
          },
          {
            "label": "Tyre grip",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-tyre-grip/"
          },
          {
            "label": "Ground contact",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-ground-contact/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "compare",
      "namespace": "signal",
      "slug": "signal-block-compare",
      "canonicalSlug": "signal-block-compare",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Compare",
        "label": "Compare",
        "summary": "Compares two signals of the same quantity; outputs 0 or 1. Operation: 0 <, 1 ≤, 2 >, 3 ≥, 4 =, 5 ≠. Equality is exact; no hidden tolerance.",
        "details": [
          "Block type: compare.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Compare",
          "caption": "Compares two signals of the same quantity; outputs 0 or 1. Operation: 0 <, 1 ≤, 2 >, 3 ≥, 4 =, 5 ≠. Equality is exact; no hidden tolerance."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Left",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "Right",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "inputQuantity",
            "label": "Input quantity",
            "unit": "",
            "value": "dimensionless"
          },
          {
            "id": "operation",
            "label": "Operation (0 <, 1 ≤, 2 >, 3 ≥, 4 =, 5 ≠)",
            "unit": "",
            "value": "3"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "constant",
      "namespace": "signal",
      "slug": "signal-block-constant",
      "canonicalSlug": "signal-block-constant",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Constant",
        "label": "Constant",
        "summary": "A fixed sourced value.",
        "details": [
          "Block type: constant.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "c",
          "label": "Declared constant",
          "caption": "A fixed sourced value."
        },
        "inputs": [],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "value",
            "label": "Value",
            "unit": "",
            "value": "1"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/",
        "related": [
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "converter-loss",
      "namespace": "signal",
      "slug": "signal-block-converter-loss",
      "canonicalSlug": "signal-block-converter-loss",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Converter loss",
        "label": "Converter loss",
        "summary": "Designer power-electronics class: fixed·P_rated + conduction·P²/P_rated + switching·|P| on the throughput power.",
        "details": [
          "Block type: converter-loss.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "physical-model",
          "symbol": "inputs → equation → response",
          "label": "Reduced vehicle equation",
          "caption": "Designer power-electronics class: fixed·P_rated + conduction·P²/P_rated + switching·|P| on the throughput power."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Throughput power",
            "quantity": "power",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "power",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "ratedW",
            "label": "Rated power",
            "unit": "W",
            "value": "100000"
          },
          {
            "id": "fixedFrac",
            "label": "Fixed loss fraction",
            "unit": "",
            "value": "0.003"
          },
          {
            "id": "conductionFrac",
            "label": "Conduction loss fraction",
            "unit": "",
            "value": "0.012"
          },
          {
            "id": "switchingFrac",
            "label": "Switching loss fraction",
            "unit": "",
            "value": "0.008"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-converter-loss/",
        "related": [
          {
            "label": "Road load",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-road-load/"
          },
          {
            "label": "Tyre grip",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-tyre-grip/"
          },
          {
            "label": "Ground contact",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-ground-contact/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "data-store-memory",
      "namespace": "signal",
      "slug": "signal-block-data-store-memory",
      "canonicalSlug": "data-store-memory",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Storage declaration",
        "label": "Storage declaration",
        "summary": "Local typed storage with a snapshot read and one writer; values commit for the next sample.",
        "details": [
          "Block type: data-store-memory.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Local typed storage with a snapshot read and one writer; values commit for the next sample."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-data-store-memory/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "data-store-read",
      "namespace": "signal",
      "slug": "signal-block-data-store-read",
      "canonicalSlug": "data-store-read",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Storage reader",
        "label": "Storage reader",
        "summary": "Read this submodel instance’s named storage snapshot.",
        "details": [
          "Block type: data-store-read.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Read this submodel instance’s named storage snapshot."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-data-store-read/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "data-store-write",
      "namespace": "signal",
      "slug": "signal-block-data-store-write",
      "canonicalSlug": "data-store-write",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Storage writer",
        "label": "Storage writer",
        "summary": "Submit an explicitly enabled write to local sampled storage.",
        "details": [
          "Block type: data-store-write.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Submit an explicitly enabled write to local sampled storage."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-data-store-write/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "divide",
      "namespace": "signal",
      "slug": "signal-block-divide",
      "canonicalSlug": "signal-block-divide",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Divide",
        "label": "Divide",
        "summary": "scale · left / right with a guarded denominator: below the minimum magnitude the denominator keeps its sign and takes the minimum, so a variable mass or voltage never produces an infinite result silently.",
        "details": [
          "Block type: divide.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "u ÷ v",
          "label": "Divide the inputs",
          "caption": "scale · left / right with a guarded denominator: below the minimum magnitude the denominator keeps its sign and takes the minimum, so a variable mass or voltage never produces an infinite result silently."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Numerator",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "Denominator",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "scale",
            "label": "Scale",
            "unit": "",
            "value": "1"
          },
          {
            "id": "leftQuantity",
            "label": "Numerator quantity",
            "unit": "",
            "value": "dimensionless"
          },
          {
            "id": "rightQuantity",
            "label": "Denominator quantity",
            "unit": "",
            "value": "dimensionless"
          },
          {
            "id": "minDenominator",
            "label": "Minimum denominator magnitude",
            "unit": "",
            "value": "0.000001"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-divide/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "enum-cast",
      "namespace": "signal",
      "slug": "signal-block-enum-cast",
      "canonicalSlug": "enum-cast",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Enumeration code",
        "label": "Enumeration code",
        "summary": "Explicitly converts a declared enumeration signal to its integer code.",
        "details": [
          "Block type: enum-cast.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Explicitly converts a declared enumeration signal to its integer code."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-enum-cast/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "enum-constant",
      "namespace": "signal",
      "slug": "signal-block-enum-constant",
      "canonicalSlug": "enum-constant",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Enumeration constant",
        "label": "Enumeration constant",
        "summary": "Emits a declared named enumeration member with its exact integer code.",
        "details": [
          "Block type: enum-constant.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Emits a declared named enumeration member with its exact integer code."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-enum-constant/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "fan-suction",
      "namespace": "signal",
      "slug": "signal-block-fan-suction",
      "canonicalSlug": "signal-block-fan-suction",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Suction fan",
        "label": "Suction fan",
        "summary": "Affinity law on the flow fraction f (clamped 0–1): electrical power standby + (rated − standby)·f³ (mode 0, W) or suction force rated·f² (mode 1, N). One equivalent fan at an authored operating point.",
        "details": [
          "Block type: fan-suction.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "physical-model",
          "symbol": "inputs → equation → response",
          "label": "Reduced vehicle equation",
          "caption": "Affinity law on the flow fraction f (clamped 0–1): electrical power standby + (rated − standby)·f³ (mode 0, W) or suction force rated·f² (mode 1, N). One equivalent fan at an authored operating point."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Flow fraction (0–1)",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Electrical power",
            "quantity": "power",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Power",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "out1",
            "label": "Suction force",
            "quantity": "force",
            "unit": "N",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Force",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "ratedPowerW",
            "label": "Rated electrical power",
            "unit": "W",
            "value": "100000"
          },
          {
            "id": "standbyW",
            "label": "Standby power",
            "unit": "W",
            "value": "0"
          },
          {
            "id": "ratedForceN",
            "label": "Rated suction force",
            "unit": "N",
            "value": "40000"
          },
          {
            "id": "mode",
            "label": "Output (0 power, 1 force)",
            "unit": "",
            "value": "0"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-fan-suction/",
        "related": [
          {
            "label": "Road load",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-road-load/"
          },
          {
            "label": "Tyre grip",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-tyre-grip/"
          },
          {
            "label": "Ground contact",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-ground-contact/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "first-order",
      "namespace": "signal",
      "slug": "signal-block-first-order",
      "canonicalSlug": "signal-block-first-order",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "First-order state",
        "label": "First-order state",
        "summary": "A state that approaches its input with one time constant.",
        "details": [
          "Block type: first-order.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "(u − y) / τ",
          "label": "First-order state",
          "caption": "A state that approaches its input with one time constant."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Target",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "tauS",
            "label": "Time constant",
            "unit": "s",
            "value": "1"
          },
          {
            "id": "initial",
            "label": "Initial value",
            "unit": "",
            "value": "0"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "from",
      "namespace": "signal",
      "slug": "signal-block-from",
      "canonicalSlug": "from",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Named signal receiver",
        "label": "Named signal receiver",
        "summary": "Read the matching local signal without a long canvas wire.",
        "details": [
          "Block type: from.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Read the matching local signal without a long canvas wire."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-from/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "gain",
      "namespace": "signal",
      "slug": "signal-block-gain",
      "canonicalSlug": "signal-block-gain",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Gain",
        "label": "Gain",
        "summary": "Scales one signal with an explicit input quantity.",
        "details": [
          "Block type: gain.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "k × u",
          "label": "Scale the input",
          "caption": "Scales one signal with an explicit input quantity."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Input",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "gain",
            "label": "Gain",
            "unit": "",
            "value": "1"
          },
          {
            "id": "inputQuantity",
            "label": "Input quantity",
            "unit": "",
            "value": "dimensionless"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/",
        "related": [
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "goto",
      "namespace": "signal",
      "slug": "signal-block-goto",
      "canonicalSlug": "goto",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Named signal sender",
        "label": "Named signal sender",
        "summary": "Publish a typed signal under a name in this submodel.",
        "details": [
          "Block type: goto.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Publish a typed signal under a name in this submodel."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-goto/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "goto-visibility",
      "namespace": "signal",
      "slug": "signal-block-goto-visibility",
      "canonicalSlug": "goto-visibility",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Signal visibility scope",
        "label": "Signal visibility scope",
        "summary": "Allows one named sender to be resolved inside this scope and its descendants.",
        "details": [
          "Block type: goto-visibility.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Allows one named sender to be resolved inside this scope and its descendants."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-goto-visibility/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "ground-contact",
      "namespace": "signal",
      "slug": "signal-block-ground-contact",
      "canonicalSlug": "signal-block-ground-contact",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Ground contact",
        "label": "Ground contact",
        "summary": "Road-normal contact: on the surface the ground supports what the lift cannot, a one-sided damper arrests a landing and a critically damped spring settles penetration; airborne the lift acts alone. Mode 0 gives the normal acceleration, mode 1 the ground's share.",
        "details": [
          "Block type: ground-contact.",
          "3 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "physical-model",
          "symbol": "inputs → equation → response",
          "label": "Reduced vehicle equation",
          "caption": "Road-normal contact: on the surface the ground supports what the lift cannot, a one-sided damper arrests a landing and a critically damped spring settles penetration; airborne the lift acts alone. Mode 0 gives the normal acceleration, mode 1 the ground's share."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Height above road",
            "quantity": "length",
            "unit": "m",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Length",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "Normal speed",
            "quantity": "linear-speed",
            "unit": "m/s",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Speed",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in2",
            "label": "Lift acceleration",
            "quantity": "acceleration",
            "unit": "m/s²",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Acceleration",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Normal acceleration",
            "quantity": "acceleration",
            "unit": "m/s²",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Acceleration",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "out1",
            "label": "Ground share",
            "quantity": "acceleration",
            "unit": "m/s²",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Acceleration",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "landingTimeConstantS",
            "label": "Landing stroke time constant",
            "unit": "s",
            "value": "0.12"
          },
          {
            "id": "settlingRadPerS",
            "label": "Settling frequency",
            "unit": "rad/s",
            "value": "4.1667"
          },
          {
            "id": "mode",
            "label": "Output (0 normal acceleration, 1 ground share)",
            "unit": "",
            "value": "0"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-ground-contact/",
        "related": [
          {
            "label": "Road load",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-road-load/"
          },
          {
            "label": "Tyre grip",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-tyre-grip/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "inport",
      "namespace": "signal",
      "slug": "signal-block-inport",
      "canonicalSlug": "inport",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Inport",
        "label": "Inport",
        "summary": "A named subsystem input.",
        "details": [
          "Block type: inport.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "IN →",
          "label": "Subsystem input boundary",
          "caption": "A named subsystem input."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-inport/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "integrator",
      "namespace": "signal",
      "slug": "signal-block-integrator",
      "canonicalSlug": "signal-block-integrator",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Integrator",
        "label": "Integrator",
        "summary": "Accumulates a typed rate into a continuous state.",
        "details": [
          "Block type: integrator.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "∫ u dt",
          "label": "Accumulate a rate",
          "caption": "Accumulates a typed rate into a continuous state."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Rate",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "initial",
            "label": "Initial value",
            "unit": "",
            "value": "0"
          },
          {
            "id": "rateQuantity",
            "label": "Rate quantity",
            "unit": "",
            "value": "dimensionless"
          },
          {
            "id": "gain",
            "label": "Rate gain",
            "unit": "",
            "value": "1"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/",
        "related": [
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "limit",
      "namespace": "signal",
      "slug": "signal-block-limit",
      "canonicalSlug": "signal-block-limit",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Limit",
        "label": "Limit",
        "summary": "Keeps a signal inside reviewed minimum and maximum bounds.",
        "details": [
          "Block type: limit.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Limit",
          "caption": "Keeps a signal inside reviewed minimum and maximum bounds."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Input",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "min",
            "label": "Minimum",
            "unit": "",
            "value": "0"
          },
          {
            "id": "max",
            "label": "Maximum",
            "unit": "",
            "value": "1"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-limit/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "manual-variant-sink",
      "namespace": "signal",
      "slug": "signal-block-manual-variant-sink",
      "canonicalSlug": "manual-variant-sink",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Manual variant sink",
        "label": "Manual variant sink",
        "summary": "A manually configured compile-time output branch selection.",
        "details": [
          "Block type: manual-variant-sink.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "A manually configured compile-time output branch selection."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-manual-variant-sink/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "manual-variant-source",
      "namespace": "signal",
      "slug": "signal-block-manual-variant-source",
      "canonicalSlug": "manual-variant-source",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Manual variant source",
        "label": "Manual variant source",
        "summary": "A manually configured compile-time input branch selection.",
        "details": [
          "Block type: manual-variant-source.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "A manually configured compile-time input branch selection."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-manual-variant-source/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "min-max",
      "namespace": "signal",
      "slug": "signal-block-min-max",
      "canonicalSlug": "signal-block-min-max",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Minimum / maximum",
        "label": "Minimum / maximum",
        "summary": "The smaller (operation 0) or larger (operation 1) of two signals of the same quantity.",
        "details": [
          "Block type: min-max.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Minimum / maximum",
          "caption": "The smaller (operation 0) or larger (operation 1) of two signals of the same quantity."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Left",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "Right",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "operation",
            "label": "Operation (0 min, 1 max)",
            "unit": "",
            "value": "0"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-min-max/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "mpc",
      "namespace": "signal",
      "slug": "signal-block-mpc",
      "canonicalSlug": "signal-block-mpc",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Model predictive controller",
        "label": "Model predictive controller",
        "summary": "Bounded linear, successive-linearisation landing or nonlinear shooting control with explicit solver status outputs.",
        "details": [
          "Block type: mpc.",
          "2 declared inputs and 5 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "predict → constrain → act",
          "label": "Predictive control",
          "caption": "Bounded linear, successive-linearisation landing or nonlinear shooting control with explicit solver status outputs."
        },
        "inputs": [
          {
            "id": "x0",
            "quantity": "dimensionless",
            "label": "x0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "r0",
            "quantity": "dimensionless",
            "label": "r0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "u0",
            "quantity": "dimensionless",
            "label": "u0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "status",
            "quantity": "dimensionless",
            "label": "status",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "iterations",
            "quantity": "dimensionless",
            "label": "iterations",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "cost",
            "quantity": "dimensionless",
            "label": "cost",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "residual",
            "quantity": "dimensionless",
            "label": "residual",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "controller",
            "label": "Controller document",
            "unit": "",
            "value": "{\"model\":\"linear\",\"sampleTimeS\":0.02,\"nx\":1,\"nu\":1,\"ny\":1,\"Np\":10,\"Nc\":3,\"A\":[1],\"B\":[0.02],\"C\":[1],\"Q\":[1],\"R\":[0.01],\"S\":[0.1],\"umin\":[-10],\"umax\":[10],\"dumin\":[-2],\"dumax\":[2],\"ymin\":[-1e+30],\"ymax\":[1e+30],\"rho\":10,\"iterationCap\":400,\"tolerance\":0.000001,\"warmStart\":true,\"initialU\":[0],\"adaptations\":[],\"stateQuantities\":[\"dimensionless\"],\"outputQuantities\":[\"dimensionless\"],\"controlQuantities\":[\"dimensionless\"]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-mpc/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-action-submodel",
      "namespace": "signal",
      "slug": "signal-block-native-action-submodel",
      "canonicalSlug": "native-action-submodel",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Conditional action kernel",
        "label": "Conditional action kernel",
        "summary": "Executes a child on a true action flag and holds its state and output on inactive samples.",
        "details": [
          "Block type: native-action-submodel.",
          "2 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Conditional action kernel",
          "caption": "Executes a child on a true action flag and holds its state and output on inactive samples."
        },
        "inputs": [
          {
            "label": "Value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Action",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Biased value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Invocations this sample",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[],\"nested\":{\"type\":\"native-bias\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Biased value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1],\"tables\":[]}}},\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-action-submodel/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-adjustable-gain",
      "namespace": "signal",
      "slug": "signal-block-native-adjustable-gain",
      "canonicalSlug": "native-adjustable-gain",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Adjustable gain",
        "label": "Adjustable gain",
        "summary": "Scales the input by an editable gain.",
        "details": [
          "Block type: native-adjustable-gain.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "k × u",
          "label": "Scale each input element",
          "caption": "Scales the input by an editable gain."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Scaled",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Scaled\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[3],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-adjustable-gain/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-algebraic-constraint",
      "namespace": "signal",
      "slug": "signal-block-native-algebraic-constraint",
      "canonicalSlug": "native-algebraic-constraint",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Algebraic residual constraint",
        "label": "Algebraic residual constraint",
        "summary": "Solves a connected residual equation for an unknown, starting from a configured guess.",
        "details": [
          "Block type: native-algebraic-constraint.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Algebraic residual constraint",
          "caption": "Solves a connected residual equation for an unknown, starting from a configured guess."
        },
        "inputs": [
          {
            "label": "Residual",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Unknown",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Residual\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Unknown\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[[2]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-algebraic-constraint/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-arithmetic-shift",
      "namespace": "signal",
      "slug": "signal-block-native-arithmetic-shift",
      "canonicalSlug": "native-arithmetic-shift",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Arithmetic bit shift",
        "label": "Arithmetic bit shift",
        "summary": "Shifts signed 32-bit words with explicit arithmetic-right and wrapping-left rules.",
        "details": [
          "Block type: native-arithmetic-shift.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Arithmetic bit shift",
          "caption": "Shifts signed 32-bit words with explicit arithmetic-right and wrapping-left rules."
        },
        "inputs": [
          {
            "label": "Signed word",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "i32",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "i32"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "i32",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "i32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Signed word\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"i32\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"i32\"}],\"sampleTimeS\":0,\"params\":[-1],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-arithmetic-shift/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-array-map",
      "namespace": "signal",
      "slug": "signal-block-native-array-map",
      "canonicalSlug": "native-array-map",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Array element submodel",
        "label": "Array element submodel",
        "summary": "Executes one pure stateless nested kernel independently for each element. Stateful and multi-block nested graphs are refused.",
        "details": [
          "Block type: native-array-map.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "matrix → operation → result",
          "label": "Array element submodel",
          "caption": "Executes one pure stateless nested kernel independently for each element. Stateful and multi-block nested graphs are refused."
        },
        "inputs": [
          {
            "label": "Array",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Mapped array",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Array\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Mapped array\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[],\"nested\":{\"type\":\"native-bias\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Biased value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[2],\"tables\":[]}}}}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-array-map/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-assertion",
      "namespace": "signal",
      "slug": "signal-block-native-assertion",
      "canonicalSlug": "native-assertion",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Assertion",
        "label": "Assertion",
        "summary": "Stops the simulation if its Boolean condition is false.",
        "details": [
          "Block type: native-assertion.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Assertion",
          "caption": "Stops the simulation if its Boolean condition is false."
        },
        "inputs": [
          {
            "label": "Condition",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Passed",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Condition\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Passed\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-assertion/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-assignment",
      "namespace": "signal",
      "slug": "signal-block-native-assignment",
      "canonicalSlug": "native-assignment",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Array assignment",
        "label": "Array assignment",
        "summary": "Replaces selected zero-based array elements with connected replacement values.",
        "details": [
          "Block type: native-assignment.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Array assignment",
          "caption": "Replaces selected zero-based array elements with connected replacement values."
        },
        "inputs": [
          {
            "label": "Original",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "label": "Replacement",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Original\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Replacement\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-assignment/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-bias",
      "namespace": "signal",
      "slug": "signal-block-native-bias",
      "canonicalSlug": "native-bias",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Bias",
        "label": "Bias",
        "summary": "Adds a constant offset to every input element.",
        "details": [
          "Block type: native-bias.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "u + b",
          "label": "Add the configured bias",
          "caption": "Adds a constant offset to every input element."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Biased value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Biased value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[2],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-bias/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-bit-clear",
      "namespace": "signal",
      "slug": "signal-block-native-bit-clear",
      "canonicalSlug": "native-bit-clear",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Clear bit",
        "label": "Clear bit",
        "summary": "Clears a selected bit of an unsigned 32-bit word.",
        "details": [
          "Block type: native-bit-clear.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Clear bit",
          "caption": "Clears a selected bit of an unsigned 32-bit word."
        },
        "inputs": [
          {
            "label": "Word",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Word\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"sampleTimeS\":0,\"params\":[1],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-bit-clear/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-bit-pack",
      "namespace": "signal",
      "slug": "signal-block-native-bit-pack",
      "canonicalSlug": "native-bit-pack",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Pack Boolean bits",
        "label": "Pack Boolean bits",
        "summary": "Packs Boolean values into an unsigned word, least significant bit first.",
        "details": [
          "Block type: native-bit-pack.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "Boolean bits → word",
          "label": "Pack Boolean elements",
          "caption": "Packs Boolean values into an unsigned word, least significant bit first."
        },
        "inputs": [
          {
            "label": "Bits",
            "shape": [
              4
            ],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 4",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Word",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Bits\",\"shape\":[4],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"outputs\":[{\"label\":\"Word\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-bit-pack/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-bit-set",
      "namespace": "signal",
      "slug": "signal-block-native-bit-set",
      "canonicalSlug": "native-bit-set",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Set bit",
        "label": "Set bit",
        "summary": "Sets a selected bit of an unsigned 32-bit word.",
        "details": [
          "Block type: native-bit-set.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Set bit",
          "caption": "Sets a selected bit of an unsigned 32-bit word."
        },
        "inputs": [
          {
            "label": "Word",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Word\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"sampleTimeS\":0,\"params\":[3],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-bit-set/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-bitwise-operator",
      "namespace": "signal",
      "slug": "signal-block-native-bitwise-operator",
      "canonicalSlug": "native-bitwise-operator",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Bitwise operator",
        "label": "Bitwise operator",
        "summary": "Applies bitwise logic to unsigned 32-bit words.",
        "details": [
          "Block type: native-bitwise-operator.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Bitwise operator",
          "caption": "Applies bitwise logic to unsigned 32-bit words."
        },
        "inputs": [
          {
            "label": "A",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          },
          {
            "label": "B",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"A\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"},{\"label\":\"B\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"sampleTimeS\":0,\"params\":[2],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-bitwise-operator/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-boolean-operator",
      "namespace": "signal",
      "slug": "signal-block-native-boolean-operator",
      "canonicalSlug": "native-boolean-operator",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Boolean operator",
        "label": "Boolean operator",
        "summary": "Combines Boolean arrays using AND, OR, XOR, NAND, NOR or inversion.",
        "details": [
          "Block type: native-boolean-operator.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Boolean operator",
          "caption": "Combines Boolean arrays using AND, OR, XOR, NAND, NOR or inversion."
        },
        "inputs": [
          {
            "label": "A",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "bool"
          },
          {
            "label": "B",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"A\",\"shape\":[3],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"},{\"label\":\"B\",\"shape\":[3],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[3],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0,\"params\":[0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-boolean-operator/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-bounded-integrator",
      "namespace": "signal",
      "slug": "signal-block-native-bounded-integrator",
      "canonicalSlug": "native-bounded-integrator",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Bounded continuous integrator",
        "label": "Bounded continuous integrator",
        "summary": "Integrates a rate while preventing further outward motion at configured bounds.",
        "details": [
          "Block type: native-bounded-integrator.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Integrates a rate while preventing further outward motion at configured bounds."
        },
        "inputs": [
          {
            "label": "Rate",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Integral",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Rate\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Integral\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1,-10,10],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-bounded-integrator/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-call-count-split",
      "namespace": "signal",
      "slug": "signal-block-native-call-count-split",
      "canonicalSlug": "native-call-count-split",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Invocation count fan-out",
        "label": "Invocation count fan-out",
        "summary": "Copies one accepted-sample call count to fixed typed branches. It does not impose side-effect order between independent downstream models.",
        "details": [
          "Block type: native-call-count-split.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Invocation count fan-out",
          "caption": "Copies one accepted-sample call count to fixed typed branches. It does not impose side-effect order between independent downstream models."
        },
        "inputs": [
          {
            "label": "Calls",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "outputs": [
          {
            "label": "Branch 1",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          },
          {
            "label": "Branch 2",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[2],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-call-count-split/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-call-generator",
      "namespace": "signal",
      "slug": "signal-block-native-call-generator",
      "canonicalSlug": "native-call-generator",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sampled invocation generator",
        "label": "Sampled invocation generator",
        "summary": "Emits a bounded call count on enabled sample hits, after an integer sample offset; missed disabled hits are not replayed.",
        "details": [
          "Block type: native-call-generator.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Sampled invocation generator",
          "caption": "Emits a bounded call count on enabled sample hits, after an integer sample offset; missed disabled hits are not replayed."
        },
        "inputs": [
          {
            "label": "Enabled",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Calls",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          },
          {
            "label": "Total calls",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[1,0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-call-generator/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-change",
      "namespace": "signal",
      "slug": "signal-block-native-change",
      "canonicalSlug": "native-change",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Detect change",
        "label": "Detect change",
        "summary": "Reports whether the input changed since its previous sample.",
        "details": [
          "Block type: native-change.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Detect change",
          "caption": "Reports whether the input changed since its previous sample."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Detected",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Detected\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-change/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-check-dynamic-gap",
      "namespace": "signal",
      "slug": "signal-block-native-check-dynamic-gap",
      "canonicalSlug": "native-check-dynamic-gap",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Dynamic forbidden interval check",
        "label": "Dynamic forbidden interval check",
        "summary": "Checks that a value is outside the closed interval supplied by the current lower and upper inputs.",
        "details": [
          "Block type: native-check-dynamic-gap.",
          "3 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Dynamic forbidden interval check",
          "caption": "Checks that a value is outside the closed interval supplied by the current lower and upper inputs."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Lower bound",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Upper bound",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Outside forbidden interval",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"},{\"label\":\"Lower bound\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"},{\"label\":\"Upper bound\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Outside forbidden interval\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-check-dynamic-gap/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-check-dynamic-lower",
      "namespace": "signal",
      "slug": "signal-block-native-check-dynamic-lower",
      "canonicalSlug": "native-check-dynamic-lower",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Dynamic lower-bound check",
        "label": "Dynamic lower-bound check",
        "summary": "Checks a scalar against a connected inclusive lower bound.",
        "details": [
          "Block type: native-check-dynamic-lower.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Dynamic lower-bound check",
          "caption": "Checks a scalar against a connected inclusive lower bound."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Lower bound",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Pass",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"},{\"label\":\"Lower bound\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Pass\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-check-dynamic-lower/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-check-dynamic-range",
      "namespace": "signal",
      "slug": "signal-block-native-check-dynamic-range",
      "canonicalSlug": "native-check-dynamic-range",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Dynamic range check",
        "label": "Dynamic range check",
        "summary": "Reports whether a scalar lies between two input bounds. Reversed bounds are invalid.",
        "details": [
          "Block type: native-check-dynamic-range.",
          "3 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Dynamic range check",
          "caption": "Reports whether a scalar lies between two input bounds. Reversed bounds are invalid."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Lower bound",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Upper bound",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Within bounds",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"},{\"label\":\"Lower bound\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"},{\"label\":\"Upper bound\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Within bounds\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-check-dynamic-range/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-check-dynamic-upper",
      "namespace": "signal",
      "slug": "signal-block-native-check-dynamic-upper",
      "canonicalSlug": "native-check-dynamic-upper",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Dynamic upper-bound check",
        "label": "Dynamic upper-bound check",
        "summary": "Checks a scalar against a connected inclusive upper bound.",
        "details": [
          "Block type: native-check-dynamic-upper.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Dynamic upper-bound check",
          "caption": "Checks a scalar against a connected inclusive upper bound."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Upper bound",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Pass",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"},{\"label\":\"Upper bound\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Pass\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-check-dynamic-upper/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-check-gap",
      "namespace": "signal",
      "slug": "signal-block-native-check-gap",
      "canonicalSlug": "native-check-gap",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Signal gap check",
        "label": "Signal gap check",
        "summary": "Reports whether the absolute difference between two inputs is within a configured tolerance.",
        "details": [
          "Block type: native-check-gap.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Signal gap check",
          "caption": "Reports whether the absolute difference between two inputs is within a configured tolerance."
        },
        "inputs": [
          {
            "label": "First value",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Second value",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Pass",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"First value\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"},{\"label\":\"Second value\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Pass\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[0.5],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-check-gap/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-check-gradient",
      "namespace": "signal",
      "slug": "signal-block-native-check-gradient",
      "canonicalSlug": "native-check-gradient",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sample difference check",
        "label": "Sample difference check",
        "summary": "Checks absolute per-sample change against a strict maximum. The first comparison is skipped and reports zero change.",
        "details": [
          "Block type: native-check-gradient.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Sample difference check",
          "caption": "Checks absolute per-sample change against a strict maximum. The first comparison is skipped and reports zero change."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Pass",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "label": "Absolute sample difference",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Pass\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"},{\"label\":\"Absolute sample difference\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[0.3],\"sampleTimeS\":0.1}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-check-gradient/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-check-lower",
      "namespace": "signal",
      "slug": "signal-block-native-check-lower",
      "canonicalSlug": "native-check-lower",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Static lower-bound check",
        "label": "Static lower-bound check",
        "summary": "Reports whether a scalar is greater than or equal to its configured bound.",
        "details": [
          "Block type: native-check-lower.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Static lower-bound check",
          "caption": "Reports whether a scalar is greater than or equal to its configured bound."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Pass",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Pass\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[3],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-check-lower/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-check-range",
      "namespace": "signal",
      "slug": "signal-block-native-check-range",
      "canonicalSlug": "native-check-range",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Static range check",
        "label": "Static range check",
        "summary": "Reports whether a scalar lies inside inclusive configured bounds.",
        "details": [
          "Block type: native-check-range.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Static range check",
          "caption": "Reports whether a scalar lies inside inclusive configured bounds."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Within bounds",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Within bounds\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[0,10],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-check-range/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-check-resolution",
      "namespace": "signal",
      "slug": "signal-block-native-check-resolution",
      "canonicalSlug": "native-check-resolution",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Input resolution check",
        "label": "Input resolution check",
        "summary": "Checks distance to the nearest quantization grid point with an explicit absolute tolerance.",
        "details": [
          "Block type: native-check-resolution.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Input resolution check",
          "caption": "Checks distance to the nearest quantization grid point with an explicit absolute tolerance."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "On grid",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"On grid\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[0.25,1e-9],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-check-resolution/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-check-static-gap",
      "namespace": "signal",
      "slug": "signal-block-native-check-static-gap",
      "canonicalSlug": "native-check-static-gap",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Forbidden interval check",
        "label": "Forbidden interval check",
        "summary": "Passes only values outside the closed forbidden interval; values equal to either boundary fail.",
        "details": [
          "Block type: native-check-static-gap.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Forbidden interval check",
          "caption": "Passes only values outside the closed forbidden interval; values equal to either boundary fail."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Outside forbidden interval",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Outside forbidden interval\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[2,4],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-check-static-gap/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-check-upper",
      "namespace": "signal",
      "slug": "signal-block-native-check-upper",
      "canonicalSlug": "native-check-upper",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Static upper-bound check",
        "label": "Static upper-bound check",
        "summary": "Reports whether a scalar is less than or equal to its configured bound.",
        "details": [
          "Block type: native-check-upper.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Static upper-bound check",
          "caption": "Reports whether a scalar is less than or equal to its configured bound."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Pass",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Pass\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[3],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-check-upper/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-chirp",
      "namespace": "signal",
      "slug": "signal-block-native-chirp",
      "canonicalSlug": "native-chirp",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Linear frequency sweep",
        "label": "Linear frequency sweep",
        "summary": "Sweeps frequency linearly, then continues at the final frequency without a phase discontinuity.",
        "details": [
          "Block type: native-chirp.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Sweeps frequency linearly, then continues at the final frequency without a phase discontinuity."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Signal",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "source",
            "label": "Signal profile",
            "unit": "",
            "value": "{\"outputs\":[{\"label\":\"Signal\",\"quantity\":\"inherit\",\"shape\":[],\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1,1,3,2,0,0,0],\"times\":[],\"values\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-chirp/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-compare-constant",
      "namespace": "signal",
      "slug": "signal-block-native-compare-constant",
      "canonicalSlug": "native-compare-constant",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Compare to constant",
        "label": "Compare to constant",
        "summary": "Compares each input value with a configured constant.",
        "details": [
          "Block type: native-compare-constant.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Compares each input value with a configured constant."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0,\"params\":[5,3],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-compare-constant/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-compare-zero",
      "namespace": "signal",
      "slug": "signal-block-native-compare-zero",
      "canonicalSlug": "native-compare-zero",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Compare to zero",
        "label": "Compare to zero",
        "summary": "Compares each input value with zero.",
        "details": [
          "Block type: native-compare-zero.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Compare to zero",
          "caption": "Compares each input value with zero."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0,\"params\":[0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-compare-zero/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-complex-parts",
      "namespace": "signal",
      "slug": "signal-block-native-complex-parts",
      "canonicalSlug": "native-complex-parts",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Complex to real and imaginary",
        "label": "Complex to real and imaginary",
        "summary": "Separates each complex value into real and imaginary components.",
        "details": [
          "Block type: native-complex-parts.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Complex to real and imaginary",
          "caption": "Separates each complex value into real and imaginary components."
        },
        "inputs": [
          {
            "label": "Complex",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "complex",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "complex"
          }
        ],
        "outputs": [
          {
            "label": "Real",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          },
          {
            "label": "Imaginary",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Complex\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"complex\"}],\"outputs\":[{\"label\":\"Real\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Imaginary\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-complex-parts/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-complex-polar",
      "namespace": "signal",
      "slug": "signal-block-native-complex-polar",
      "canonicalSlug": "native-complex-polar",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Complex to magnitude and angle",
        "label": "Complex to magnitude and angle",
        "summary": "Separates each complex value into magnitude and phase angle.",
        "details": [
          "Block type: native-complex-polar.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Complex to magnitude and angle",
          "caption": "Separates each complex value into magnitude and phase angle."
        },
        "inputs": [
          {
            "label": "Complex",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "complex",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "complex"
          }
        ],
        "outputs": [
          {
            "label": "Magnitude",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          },
          {
            "label": "Angle",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Complex\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"complex\"}],\"outputs\":[{\"label\":\"Magnitude\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Angle\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-complex-polar/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-conditional-hold",
      "namespace": "signal",
      "slug": "signal-block-native-conditional-hold",
      "canonicalSlug": "native-conditional-hold",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Conditional hold",
        "label": "Conditional hold",
        "summary": "Updates a held value only while a Boolean enable input is true.",
        "details": [
          "Block type: native-conditional-hold.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Conditional hold",
          "caption": "Updates a held value only while a Boolean enable input is true."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Enable",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Held",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Enable\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"outputs\":[{\"label\":\"Held\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[2]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-conditional-hold/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-constant",
      "namespace": "signal",
      "slug": "signal-block-native-constant",
      "canonicalSlug": "native-constant",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Array constant",
        "label": "Array constant",
        "summary": "Produces a configured scalar, vector or matrix throughout the simulation.",
        "details": [
          "Block type: native-constant.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Produces a configured scalar, vector or matrix throughout the simulation."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[],\"outputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[[1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-constant/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-counter",
      "namespace": "signal",
      "slug": "signal-block-native-counter",
      "canonicalSlug": "native-counter",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Bounded counter",
        "label": "Bounded counter",
        "summary": "Counts at sample instants with explicit initial value, increment, limits and wrap or saturate behavior.",
        "details": [
          "Block type: native-counter.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Counts at sample instants with explicit initial value, increment, limits and wrap or saturate behavior."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Signal",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "source",
            "label": "Signal profile",
            "unit": "",
            "value": "{\"outputs\":[{\"label\":\"Signal\",\"quantity\":\"inherit\",\"shape\":[],\"elementType\":\"real\"}],\"sampleTimeS\":0.25,\"params\":[0,1,0,3,1],\"times\":[],\"values\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-counter/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-cross-product",
      "namespace": "signal",
      "slug": "signal-block-native-cross-product",
      "canonicalSlug": "native-cross-product",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Cross product",
        "label": "Cross product",
        "summary": "Calculates the three-dimensional cross product of two real vectors.",
        "details": [
          "Block type: native-cross-product.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "a × b",
          "label": "Three-dimensional cross product",
          "caption": "Calculates the three-dimensional cross product of two real vectors."
        },
        "inputs": [
          {
            "label": "A",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "label": "B",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Cross product",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"A\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"B\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Cross product\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-cross-product/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-data-store",
      "namespace": "signal",
      "slug": "signal-block-native-data-store",
      "canonicalSlug": "native-data-store",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sampled storage",
        "label": "Sampled storage",
        "summary": "Reads a snapshot at each sample, then commits the enabled write for the next sample. Each block instance owns independent typed storage.",
        "details": [
          "Block type: native-data-store.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Reads a snapshot at each sample, then commits the enabled write for the next sample. Each block instance owns independent typed storage."
        },
        "inputs": [
          {
            "label": "Write value",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "label": "Write enabled",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Stored value",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Write value\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"},{\"label\":\"Write enabled\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Stored value\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[0,0,0],\"sampleTimeS\":0.1}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-data-store/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-deadzone",
      "namespace": "signal",
      "slug": "signal-block-native-deadzone",
      "canonicalSlug": "native-deadzone",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Dead zone",
        "label": "Dead zone",
        "summary": "Suppresses values inside a dead zone and subtracts the nearest edge outside it.",
        "details": [
          "Block type: native-deadzone.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Dead zone",
          "caption": "Suppresses values inside a dead zone and subtracts the nearest edge outside it."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[-1,1],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-deadzone/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-decrease",
      "namespace": "signal",
      "slug": "signal-block-native-decrease",
      "canonicalSlug": "native-decrease",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Detect decrease",
        "label": "Detect decrease",
        "summary": "Reports whether the input decreased since its previous sample.",
        "details": [
          "Block type: native-decrease.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Detect decrease",
          "caption": "Reports whether the input decreased since its previous sample."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Detected",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Detected\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[2]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-decrease/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-delay",
      "namespace": "signal",
      "slug": "signal-block-native-delay",
      "canonicalSlug": "native-delay",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sample delay",
        "label": "Sample delay",
        "summary": "Returns an input from a configured number of sample ticks earlier.",
        "details": [
          "Block type: native-delay.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Returns an input from a configured number of sample ticks earlier."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Delayed",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Delayed\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[2],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-delay/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-demux",
      "namespace": "signal",
      "slug": "signal-block-native-demux",
      "canonicalSlug": "native-demux",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Vector splitter",
        "label": "Vector splitter",
        "summary": "Splits a vector into separately connectable scalar ports in element order.",
        "details": [
          "Block type: native-demux.",
          "1 declared input and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "vector → scalar pins",
          "label": "Split ordered vector elements",
          "caption": "Splits a vector into separately connectable scalar ports in element order."
        },
        "inputs": [
          {
            "label": "Vector",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "First",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Second",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Third",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Vector\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"First\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"},{\"label\":\"Second\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"},{\"label\":\"Third\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-demux/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-descriptor-state-space",
      "namespace": "signal",
      "slug": "signal-block-native-descriptor-state-space",
      "canonicalSlug": "native-descriptor-state-space",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Nonsingular descriptor state model",
        "label": "Nonsingular descriptor state model",
        "summary": "Simulates a descriptor state equation when its E matrix is nonsingular.",
        "details": [
          "Block type: native-descriptor-state-space.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Simulates a descriptor state equation when its E matrix is nonsingular."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1],\"tables\":[[2],[-2],[2],[1],[0],[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-descriptor-state-space/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-diagonal-matrix",
      "namespace": "signal",
      "slug": "signal-block-native-diagonal-matrix",
      "canonicalSlug": "native-diagonal-matrix",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Create diagonal matrix",
        "label": "Create diagonal matrix",
        "summary": "Places vector elements on a matrix diagonal and fills other entries with zero.",
        "details": [
          "Block type: native-diagonal-matrix.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "v → diag(v)",
          "label": "Construct a diagonal matrix",
          "caption": "Places vector elements on a matrix diagonal and fills other entries with zero."
        },
        "inputs": [
          {
            "label": "Diagonal",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Matrix",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Diagonal\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Matrix\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-diagonal-matrix/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-difference",
      "namespace": "signal",
      "slug": "signal-block-native-difference",
      "canonicalSlug": "native-difference",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sample difference",
        "label": "Sample difference",
        "summary": "Subtracts the previous sample from the current sample without dividing by time.",
        "details": [
          "Block type: native-difference.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] − u[k−1]",
          "label": "Change between samples",
          "caption": "Subtracts the previous sample from the current sample without dividing by time."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Difference",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Difference\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-difference/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-digital-clock",
      "namespace": "signal",
      "slug": "signal-block-native-digital-clock",
      "canonicalSlug": "native-digital-clock",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Digital clock",
        "label": "Digital clock",
        "summary": "Samples simulation time and holds that time between instants.",
        "details": [
          "Block type: native-digital-clock.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Samples simulation time and holds that time between instants."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Signal",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "source",
            "label": "Signal profile",
            "unit": "",
            "value": "{\"outputs\":[{\"label\":\"Signal\",\"quantity\":\"inherit\",\"shape\":[],\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[],\"times\":[],\"values\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-digital-clock/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-direct-lookup",
      "namespace": "signal",
      "slug": "signal-block-native-direct-lookup",
      "canonicalSlug": "native-direct-lookup",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Direct N-D lookup",
        "label": "Direct N-D lookup",
        "summary": "Selects an exact table element using zero-based multidimensional indices.",
        "details": [
          "Block type: native-direct-lookup.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "lookup",
          "symbol": "y = table(u)",
          "label": "Interpolate declared data",
          "caption": "Selects an exact table element using zero-based multidimensional indices."
        },
        "inputs": [
          {
            "label": "Indices",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "u32"
          }
        ],
        "outputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Indices\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"u32\"}],\"outputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[2,2],\"tables\":[[10,20,30,40]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-direct-lookup/",
        "related": [
          {
            "label": "Lookup 1d",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-1d/"
          },
          {
            "label": "Prelookup",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-prelookup/"
          },
          {
            "label": "Lookup nd",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-nd/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-discrete-derivative",
      "namespace": "signal",
      "slug": "signal-block-native-discrete-derivative",
      "canonicalSlug": "native-discrete-derivative",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Discrete derivative",
        "label": "Discrete derivative",
        "summary": "Estimates a rate of change from successive samples and their elapsed time.",
        "details": [
          "Block type: native-discrete-derivative.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "Δu / Δt",
          "label": "Sampled rate of change",
          "caption": "Estimates a rate of change from successive samples and their elapsed time."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Derivative",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Derivative\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-discrete-derivative/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-discrete-filter",
      "namespace": "signal",
      "slug": "signal-block-native-discrete-filter",
      "canonicalSlug": "native-discrete-filter",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Discrete transfer function",
        "label": "Discrete transfer function",
        "summary": "Applies a causal discrete transfer function with separate input and output histories.",
        "details": [
          "Block type: native-discrete-filter.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Discrete transfer function",
          "caption": "Applies a causal discrete transfer function with separate input and output histories."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Filtered",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Filtered\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[0.5,0.5],[1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-discrete-filter/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-discrete-first-order",
      "namespace": "signal",
      "slug": "signal-block-native-discrete-first-order",
      "canonicalSlug": "native-discrete-first-order",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Discrete first-order filter",
        "label": "Discrete first-order filter",
        "summary": "Smooths a signal with a stable first-order discrete filter.",
        "details": [
          "Block type: native-discrete-first-order.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Smooths a signal with a stable first-order discrete filter."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[0.5],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-discrete-first-order/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-discrete-integrator",
      "namespace": "signal",
      "slug": "signal-block-native-discrete-integrator",
      "canonicalSlug": "native-discrete-integrator",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Discrete integrator",
        "label": "Discrete integrator",
        "summary": "Accumulates a signal over elapsed sample intervals with optional output bounds.",
        "details": [
          "Block type: native-discrete-integrator.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Accumulates a signal over elapsed sample intervals with optional output bounds."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Integral",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Integral\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[1,-1000000000,1000000000],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-discrete-integrator/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-discrete-lead-lag",
      "namespace": "signal",
      "slug": "signal-block-native-discrete-lead-lag",
      "canonicalSlug": "native-discrete-lead-lag",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Discrete lead-lag filter",
        "label": "Discrete lead-lag filter",
        "summary": "Applies a discrete lead-lag response derived from configured continuous time constants.",
        "details": [
          "Block type: native-discrete-lead-lag.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Discrete lead-lag filter",
          "caption": "Applies a discrete lead-lag response derived from configured continuous time constants."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[0.1,0.2,1],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-discrete-lead-lag/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-discrete-pid",
      "namespace": "signal",
      "slug": "signal-block-native-discrete-pid",
      "canonicalSlug": "native-discrete-pid",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Discrete weighted PID",
        "label": "Discrete weighted PID",
        "summary": "Combines proportional, integral and filtered derivative control with setpoint weights and limits.",
        "details": [
          "Block type: native-discrete-pid.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "sampled P + I + D",
          "label": "Discrete PID control",
          "caption": "Combines proportional, integral and filtered derivative control with setpoint weights and limits."
        },
        "inputs": [
          {
            "label": "Setpoint",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Measurement",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Control",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Setpoint\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Measurement\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Control\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[1,0.5,0,0.1,-10,10,1,0],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-discrete-pid/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-discrete-real-zero",
      "namespace": "signal",
      "slug": "signal-block-native-discrete-real-zero",
      "canonicalSlug": "native-discrete-real-zero",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Discrete real-zero filter",
        "label": "Discrete real-zero filter",
        "summary": "Applies a gain and one real zero to successive input samples.",
        "details": [
          "Block type: native-discrete-real-zero.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Discrete real-zero filter",
          "caption": "Applies a gain and one real zero to successive input samples."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[0.5,2],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-discrete-real-zero/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-discrete-state-space",
      "namespace": "signal",
      "slug": "signal-block-native-discrete-state-space",
      "canonicalSlug": "native-discrete-state-space",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Discrete state space",
        "label": "Discrete state space",
        "summary": "Advances a discrete linear state model and computes its output at each tick.",
        "details": [
          "Block type: native-discrete-state-space.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "x[k+1] = Ax[k] + Bu[k]",
          "label": "Discrete state model",
          "caption": "Advances a discrete linear state model and computes its output at each tick."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[1],\"tables\":[[0.5],[1],[1],[0],[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-discrete-state-space/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-discrete-zero-pole",
      "namespace": "signal",
      "slug": "signal-block-native-discrete-zero-pole",
      "canonicalSlug": "native-discrete-zero-pole",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Discrete pole-zero model",
        "label": "Discrete pole-zero model",
        "summary": "Builds a causal discrete filter from real-coefficient poles, zeros and gain.",
        "details": [
          "Block type: native-discrete-zero-pole.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Discrete pole-zero model",
          "caption": "Builds a causal discrete filter from real-coefficient poles, zeros and gain."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[1],\"tables\":[[],[0.5,0],[]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-discrete-zero-pole/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-display",
      "namespace": "signal",
      "slug": "signal-block-native-display",
      "canonicalSlug": "native-display",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Live signal display",
        "label": "Live signal display",
        "summary": "Displays values from the completed simulation trace during playback, with units and array-element labels.",
        "details": [
          "Block type: native-display.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Live signal display",
          "caption": "Displays values from the completed simulation trace during playback, with units and array-element labels."
        },
        "inputs": [
          {
            "label": "Signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Displayed signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Displayed signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-display/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-dot-product",
      "namespace": "signal",
      "slug": "signal-block-native-dot-product",
      "canonicalSlug": "native-dot-product",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Dot product",
        "label": "Dot product",
        "summary": "Adds the pairwise products of two equal-length real arrays.",
        "details": [
          "Block type: native-dot-product.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "Σ aᵢ bᵢ",
          "label": "Pairwise products and sum",
          "caption": "Adds the pairwise products of two equal-length real arrays."
        },
        "inputs": [
          {
            "label": "A",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "label": "B",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Dot product",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"A\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"B\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Dot product\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-dot-product/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-duty-pwm",
      "namespace": "signal",
      "slug": "signal-block-native-duty-pwm",
      "canonicalSlug": "native-duty-pwm",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sampled duty-controlled PWM",
        "label": "Sampled duty-controlled PWM",
        "summary": "Connected duty is compared with the carrier at sample instants; pulses between ticks are not reconstructed.",
        "details": [
          "Block type: native-duty-pwm.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Sampled duty-controlled PWM",
          "caption": "Connected duty is compared with the carrier at sample instants; pulses between ticks are not reconstructed."
        },
        "inputs": [
          {
            "label": "Duty ratio",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Pulse",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Duty ratio\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Pulse\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0.05,\"params\":[2,0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-duty-pwm/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-dynamic-deadzone",
      "namespace": "signal",
      "slug": "signal-block-native-dynamic-deadzone",
      "canonicalSlug": "native-dynamic-deadzone",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Dynamic dead zone",
        "label": "Dynamic dead zone",
        "summary": "Applies a dead zone whose lower and upper edges arrive through input ports.",
        "details": [
          "Block type: native-dynamic-deadzone.",
          "3 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Dynamic dead zone",
          "caption": "Applies a dead zone whose lower and upper edges arrive through input ports."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Lower",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Upper",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Lower\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Upper\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-dynamic-deadzone/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-dynamic-interval",
      "namespace": "signal",
      "slug": "signal-block-native-dynamic-interval",
      "canonicalSlug": "native-dynamic-interval",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Dynamic interval test",
        "label": "Dynamic interval test",
        "summary": "Tests whether values lie between two connected bounds.",
        "details": [
          "Block type: native-dynamic-interval.",
          "3 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Dynamic interval test",
          "caption": "Tests whether values lie between two connected bounds."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Lower",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Upper",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Inside",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Lower\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Upper\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Inside\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0,\"params\":[1,1],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-dynamic-interval/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-dynamic-lookup",
      "namespace": "signal",
      "slug": "signal-block-native-dynamic-lookup",
      "canonicalSlug": "native-dynamic-lookup",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Dynamic 1-D lookup",
        "label": "Dynamic 1-D lookup",
        "summary": "Interpolates a one-dimensional table whose breakpoints and values arrive through input ports.",
        "details": [
          "Block type: native-dynamic-lookup.",
          "3 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "lookup",
          "symbol": "y = table(u)",
          "label": "Interpolate declared data",
          "caption": "Interpolates a one-dimensional table whose breakpoints and values arrive through input ports."
        },
        "inputs": [
          {
            "label": "x",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Breakpoints",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "label": "Table values",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"x\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Breakpoints\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Table values\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-dynamic-lookup/",
        "related": [
          {
            "label": "Lookup 1d",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-1d/"
          },
          {
            "label": "Prelookup",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-prelookup/"
          },
          {
            "label": "Lookup nd",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-nd/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-dynamic-rate-limiter",
      "namespace": "signal",
      "slug": "signal-block-native-dynamic-rate-limiter",
      "canonicalSlug": "native-dynamic-rate-limiter",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sampled dynamic rate limiter",
        "label": "Sampled dynamic rate limiter",
        "summary": "Limits sampled output changes using connected rising and falling rate bounds.",
        "details": [
          "Block type: native-dynamic-rate-limiter.",
          "3 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Sampled dynamic rate limiter",
          "caption": "Limits sampled output changes using connected rising and falling rate bounds."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Rising rate",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Falling rate magnitude",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Limited",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Rising rate\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Falling rate magnitude\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Limited\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-dynamic-rate-limiter/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-dynamic-saturation",
      "namespace": "signal",
      "slug": "signal-block-native-dynamic-saturation",
      "canonicalSlug": "native-dynamic-saturation",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Dynamic saturation",
        "label": "Dynamic saturation",
        "summary": "Clips a signal to connected lower and upper bounds.",
        "details": [
          "Block type: native-dynamic-saturation.",
          "3 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Dynamic saturation",
          "caption": "Clips a signal to connected lower and upper bounds."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Lower",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Upper",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Limited",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Lower\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Upper\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Limited\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-dynamic-saturation/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-enabled-submodel",
      "namespace": "signal",
      "slug": "signal-block-native-enabled-submodel",
      "canonicalSlug": "native-enabled-submodel",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Enabled kernel",
        "label": "Enabled kernel",
        "summary": "Runs one discrete or stateless child only while enabled; disabled samples retain child memory and held output.",
        "details": [
          "Block type: native-enabled-submodel.",
          "2 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Enabled kernel",
          "caption": "Runs one discrete or stateless child only while enabled; disabled samples retain child memory and held output."
        },
        "inputs": [
          {
            "label": "Value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Enabled",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Integral",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Invocations this sample",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[0,0],\"nested\":{\"type\":\"native-discrete-integrator\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Integral\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":1,\"params\":[1,-1000000000,1000000000],\"tables\":[[0]]}}},\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-enabled-submodel/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-enabled-triggered-submodel",
      "namespace": "signal",
      "slug": "signal-block-native-enabled-triggered-submodel",
      "canonicalSlug": "native-enabled-triggered-submodel",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Enabled and triggered kernel",
        "label": "Enabled and triggered kernel",
        "summary": "Tracks every trigger edge, including while disabled, and executes only enabled edges; disabled edges are never replayed.",
        "details": [
          "Block type: native-enabled-triggered-submodel.",
          "3 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Enabled and triggered kernel",
          "caption": "Tracks every trigger edge, including while disabled, and executes only enabled edges; disabled edges are never replayed."
        },
        "inputs": [
          {
            "label": "Value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Enabled",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "label": "Trigger",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Integral",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Invocations this sample",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[0,0],\"nested\":{\"type\":\"native-discrete-integrator\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Integral\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":1,\"params\":[1,-1000000000,1000000000],\"tables\":[[0]]}}},\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-enabled-triggered-submodel/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-exclusive-merge",
      "namespace": "signal",
      "slug": "signal-block-native-exclusive-merge",
      "canonicalSlug": "native-exclusive-merge",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Exclusive action merge",
        "label": "Exclusive action merge",
        "summary": "Accepts one explicitly active branch at a sample, holds its prior value when none is active, and rejects competing writers.",
        "details": [
          "Block type: native-exclusive-merge.",
          "4 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Exclusive action merge",
          "caption": "Accepts one explicitly active branch at a sample, holds its prior value when none is active, and rejects competing writers."
        },
        "inputs": [
          {
            "label": "Branch 1 value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Branch 2 value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Branch 1 active",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "label": "Branch 2 active",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "in3",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Merged value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Accepted branch (0 means held)",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[2],\"signal\":{\"label\":\"Merged value\",\"quantity\":\"dimensionless\",\"shape\":[],\"elementType\":\"real\"},\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-exclusive-merge/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-expand-scalar",
      "namespace": "signal",
      "slug": "signal-block-native-expand-scalar",
      "canonicalSlug": "native-expand-scalar",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Expand scalar",
        "label": "Expand scalar",
        "summary": "Repeats a scalar value across a configured array shape.",
        "details": [
          "Block type: native-expand-scalar.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "matrix → operation → result",
          "label": "Expand scalar",
          "caption": "Repeats a scalar value across a configured array shape."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Matrix",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Matrix\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-expand-scalar/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-extract-bits",
      "namespace": "signal",
      "slug": "signal-block-native-extract-bits",
      "canonicalSlug": "native-extract-bits",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Extract bit range",
        "label": "Extract bit range",
        "summary": "Extracts a contiguous bit range from an unsigned 32-bit word.",
        "details": [
          "Block type: native-extract-bits.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Extract bit range",
          "caption": "Extracts a contiguous bit range from an unsigned 32-bit word."
        },
        "inputs": [
          {
            "label": "Word",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Word\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"sampleTimeS\":0,\"params\":[2,3],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-extract-bits/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-extract-diagonal",
      "namespace": "signal",
      "slug": "signal-block-native-extract-diagonal",
      "canonicalSlug": "native-extract-diagonal",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Extract diagonal",
        "label": "Extract diagonal",
        "summary": "Extracts a main or offset matrix diagonal.",
        "details": [
          "Block type: native-extract-diagonal.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "diag(A) → v",
          "label": "Extract a matrix diagonal",
          "caption": "Extracts a main or offset matrix diagonal."
        },
        "inputs": [
          {
            "label": "Matrix",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Diagonal",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Matrix\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Diagonal\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-extract-diagonal/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-fall-negative",
      "namespace": "signal",
      "slug": "signal-block-native-fall-negative",
      "canonicalSlug": "native-fall-negative",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Detect fall negative",
        "label": "Detect fall negative",
        "summary": "Reports a sampled crossing from zero or positive into negative values.",
        "details": [
          "Block type: native-fall-negative.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Detect fall negative",
          "caption": "Reports a sampled crossing from zero or positive into negative values."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Detected",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Detected\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-fall-negative/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-fall-nonpositive",
      "namespace": "signal",
      "slug": "signal-block-native-fall-nonpositive",
      "canonicalSlug": "native-fall-nonpositive",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Detect fall nonpositive",
        "label": "Detect fall nonpositive",
        "summary": "Reports a sampled crossing from positive into zero or negative values.",
        "details": [
          "Block type: native-fall-nonpositive.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Detect fall nonpositive",
          "caption": "Reports a sampled crossing from positive into zero or negative values."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Detected",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Detected\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-fall-nonpositive/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-falling-edge",
      "namespace": "signal",
      "slug": "signal-block-native-falling-edge",
      "canonicalSlug": "native-falling-edge",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Detect falling edge",
        "label": "Detect falling edge",
        "summary": "Reports a Boolean transition from true to false.",
        "details": [
          "Block type: native-falling-edge.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Detect falling edge",
          "caption": "Reports a Boolean transition from true to false."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Detected",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"outputs\":[{\"label\":\"Detected\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-falling-edge/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-filtered-derivative",
      "namespace": "signal",
      "slug": "signal-block-native-filtered-derivative",
      "canonicalSlug": "native-filtered-derivative",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Filtered continuous derivative",
        "label": "Filtered continuous derivative",
        "summary": "Estimates a continuous derivative through a finite-bandwidth filter.",
        "details": [
          "Block type: native-filtered-derivative.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → response",
          "label": "Filtered continuous derivative",
          "caption": "Estimates a continuous derivative through a finite-bandwidth filter."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Derivative",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Derivative\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0.2],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-filtered-derivative/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-find-nonzero",
      "namespace": "signal",
      "slug": "signal-block-native-find-nonzero",
      "canonicalSlug": "native-find-nonzero",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Find nonzero elements",
        "label": "Find nonzero elements",
        "summary": "Finds nonzero elements and returns their zero-based indices and valid count.",
        "details": [
          "Block type: native-find-nonzero.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Find nonzero elements",
          "caption": "Finds nonzero elements and returns their zero-based indices and valid count."
        },
        "inputs": [
          {
            "label": "Values",
            "shape": [
              4
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 4",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Indices",
            "shape": [
              4
            ],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 4",
            "elementLabel": "u32"
          },
          {
            "label": "Count",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Values\",\"shape\":[4],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Indices\",\"shape\":[4],\"quantity\":\"inherit\",\"elementType\":\"u32\"},{\"label\":\"Count\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-find-nonzero/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-fir-filter",
      "namespace": "signal",
      "slug": "signal-block-native-fir-filter",
      "canonicalSlug": "native-fir-filter",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "FIR filter",
        "label": "FIR filter",
        "summary": "Applies a finite set of weighted current and previous input samples.",
        "details": [
          "Block type: native-fir-filter.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "FIR filter",
          "caption": "Applies a finite set of weighted current and previous input samples."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Filtered",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Filtered\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[0.25,0.5,0.25],[1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-fir-filter/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-float32-bits",
      "namespace": "signal",
      "slug": "signal-block-native-float32-bits",
      "canonicalSlug": "native-float32-bits",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Float32 bit pattern",
        "label": "Float32 bit pattern",
        "summary": "Exposes the binary32 representation of a numeric value as an unsigned word.",
        "details": [
          "Block type: native-float32-bits.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Float32 bit pattern",
          "caption": "Exposes the binary32 representation of a numeric value as an unsigned word."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Bit pattern",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Bit pattern\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-float32-bits/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-for-each-submodel",
      "namespace": "signal",
      "slug": "signal-block-native-for-each-submodel",
      "canonicalSlug": "native-for-each-submodel",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Independent element kernels",
        "label": "Independent element kernels",
        "summary": "Runs one scalar child instance per vector element, with fixed shape and isolated memory for every element.",
        "details": [
          "Block type: native-for-each-submodel.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Independent element kernels",
          "caption": "Runs one scalar child instance per vector element, with fixed shape and isolated memory for every element."
        },
        "inputs": [
          {
            "label": "Iteration values",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Element results",
            "quantity": "dimensionless",
            "shape": [
              3
            ],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "label": "Invocations this sample",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[3],\"nested\":{\"type\":\"native-discrete-integrator\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Integral\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":1,\"params\":[1,-1000000000,1000000000],\"tables\":[[0]]}}},\"tables\":[[0,0,0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-for-each-submodel/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-for-iterator-submodel",
      "namespace": "signal",
      "slug": "signal-block-native-for-iterator-submodel",
      "canonicalSlug": "native-for-iterator-submodel",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Bounded for iterator",
        "label": "Bounded for iterator",
        "summary": "Processes the requested prefix of an input vector through one scalar child, at a single sample time.",
        "details": [
          "Block type: native-for-iterator-submodel.",
          "2 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Bounded for iterator",
          "caption": "Processes the requested prefix of an input vector through one scalar child, at a single sample time."
        },
        "inputs": [
          {
            "label": "Iteration values",
            "quantity": "dimensionless",
            "shape": [
              4
            ],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 4",
            "elementLabel": "real"
          },
          {
            "label": "Iterations",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "outputs": [
          {
            "label": "Integral",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Invocations this sample",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[4,1],\"nested\":{\"type\":\"native-discrete-integrator\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Integral\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":1,\"params\":[1,-1000000000,1000000000],\"tables\":[[0]]}}},\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-for-iterator-submodel/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-friction",
      "namespace": "signal",
      "slug": "signal-block-native-friction",
      "canonicalSlug": "native-friction",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Coulomb and viscous friction",
        "label": "Coulomb and viscous friction",
        "summary": "Combines Coulomb and viscous friction terms from a velocity input.",
        "details": [
          "Block type: native-friction.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Coulomb and viscous friction",
          "caption": "Combines Coulomb and viscous friction terms from a velocity input."
        },
        "inputs": [
          {
            "label": "Velocity",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Friction magnitude",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Velocity\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Friction magnitude\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[2,0.5],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-friction/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-function-call-submodel",
      "namespace": "signal",
      "slug": "signal-block-native-function-call-submodel",
      "canonicalSlug": "native-function-call-submodel",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Counted kernel invocation",
        "label": "Counted kernel invocation",
        "summary": "Executes one child the requested number of times at the accepted sample timestamp; zero calls retain memory and output.",
        "details": [
          "Block type: native-function-call-submodel.",
          "2 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Counted kernel invocation",
          "caption": "Executes one child the requested number of times at the accepted sample timestamp; zero calls retain memory and output."
        },
        "inputs": [
          {
            "label": "Value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Calls",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "outputs": [
          {
            "label": "Integral",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Invocations this sample",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[16],\"nested\":{\"type\":\"native-discrete-integrator\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Integral\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":1,\"params\":[1,-1000000000,1000000000],\"tables\":[[0]]}}},\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-function-call-submodel/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-gram-matrix",
      "namespace": "signal",
      "slug": "signal-block-native-gram-matrix",
      "canonicalSlug": "native-gram-matrix",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Gram matrix",
        "label": "Gram matrix",
        "summary": "Calculates the Gram matrix AᴴA, including complex conjugation.",
        "details": [
          "Block type: native-gram-matrix.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "Aᴴ A",
          "label": "Gram matrix",
          "caption": "Calculates the Gram matrix AᴴA, including complex conjugation."
        },
        "inputs": [
          {
            "label": "A",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "AᴴA",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"A\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"AᴴA\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-gram-matrix/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-hermitian-transpose",
      "namespace": "signal",
      "slug": "signal-block-native-hermitian-transpose",
      "canonicalSlug": "native-hermitian-transpose",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Hermitian transpose",
        "label": "Hermitian transpose",
        "summary": "Exchanges matrix rows and columns and conjugates complex values.",
        "details": [
          "Block type: native-hermitian-transpose.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "A → Aᴴ",
          "label": "Conjugate transpose",
          "caption": "Exchanges matrix rows and columns and conjugates complex values."
        },
        "inputs": [
          {
            "label": "Matrix",
            "shape": [
              2,
              1
            ],
            "quantity": "dimensionless",
            "elementType": "complex",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 1",
            "elementLabel": "complex"
          }
        ],
        "outputs": [
          {
            "label": "Conjugate transpose",
            "shape": [
              1,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "complex",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1 × 2",
            "elementLabel": "complex"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Matrix\",\"shape\":[2,1],\"quantity\":\"inherit\",\"elementType\":\"complex\"}],\"outputs\":[{\"label\":\"Conjugate transpose\",\"shape\":[1,2],\"quantity\":\"inherit\",\"elementType\":\"complex\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-hermitian-transpose/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-identity-matrix",
      "namespace": "signal",
      "slug": "signal-block-native-identity-matrix",
      "canonicalSlug": "native-identity-matrix",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Identity matrix",
        "label": "Identity matrix",
        "summary": "Produces a square identity matrix of the configured size.",
        "details": [
          "Block type: native-identity-matrix.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "matrix → operation → result",
          "label": "Identity matrix",
          "caption": "Produces a square identity matrix of the configured size."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Identity",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[],\"outputs\":[{\"label\":\"Identity\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-identity-matrix/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-if-actions",
      "namespace": "signal",
      "slug": "signal-block-native-if-actions",
      "canonicalSlug": "native-if-actions",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Comparison action router",
        "label": "Comparison action router",
        "summary": "Produces exactly one below/equal/above action flag for a configured threshold at each sample.",
        "details": [
          "Block type: native-if-actions.",
          "1 declared input and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Comparison action router",
          "caption": "Produces exactly one below/equal/above action flag for a configured threshold at each sample."
        },
        "inputs": [
          {
            "label": "Value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Below",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "label": "Equal",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "label": "Above",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "out2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-if-actions/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-increase",
      "namespace": "signal",
      "slug": "signal-block-native-increase",
      "canonicalSlug": "native-increase",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Detect increase",
        "label": "Detect increase",
        "summary": "Reports whether the input increased since its previous sample.",
        "details": [
          "Block type: native-increase.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Detect increase",
          "caption": "Reports whether the input increased since its previous sample."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Detected",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Detected\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-increase/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-initial-value",
      "namespace": "signal",
      "slug": "signal-block-native-initial-value",
      "canonicalSlug": "native-initial-value",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Initial value override",
        "label": "Initial value override",
        "summary": "Publishes the configured value at the first sample only, then passes each current input through without a sample delay.",
        "details": [
          "Block type: native-initial-value.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Initial value override",
          "caption": "Publishes the configured value at the first sample only, then passes each current input through without a sample delay."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[0,0,0],\"sampleTimeS\":0.1}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-initial-value/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-integer-bits",
      "namespace": "signal",
      "slug": "signal-block-native-integer-bits",
      "canonicalSlug": "native-integer-bits",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Integer to Boolean bits",
        "label": "Integer to Boolean bits",
        "summary": "Expands an unsigned word into Boolean bits, least significant bit first.",
        "details": [
          "Block type: native-integer-bits.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Integer to Boolean bits",
          "caption": "Expands an unsigned word into Boolean bits, least significant bit first."
        },
        "inputs": [
          {
            "label": "Word",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "outputs": [
          {
            "label": "Bits",
            "shape": [
              4
            ],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 4",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Word\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"outputs\":[{\"label\":\"Bits\",\"shape\":[4],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-integer-bits/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-interpolate-prelookup",
      "namespace": "signal",
      "slug": "signal-block-native-interpolate-prelookup",
      "canonicalSlug": "native-interpolate-prelookup",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Interpolate from prelookup",
        "label": "Interpolate from prelookup",
        "summary": "Interpolates a table using already computed cell indices and fractions.",
        "details": [
          "Block type: native-interpolate-prelookup.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "lookup",
          "symbol": "y = table(u)",
          "label": "Interpolate declared data",
          "caption": "Interpolates a table using already computed cell indices and fractions."
        },
        "inputs": [
          {
            "label": "Cell indices",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "u32"
          },
          {
            "label": "Fractions",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Cell indices\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"u32\"},{\"label\":\"Fractions\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[2,2],\"tables\":[[0,1,4,5]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-interpolate-prelookup/",
        "related": [
          {
            "label": "Lookup 1d",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-1d/"
          },
          {
            "label": "Prelookup",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-prelookup/"
          },
          {
            "label": "Lookup nd",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-nd/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-interval-test",
      "namespace": "signal",
      "slug": "signal-block-native-interval-test",
      "canonicalSlug": "native-interval-test",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Interval test",
        "label": "Interval test",
        "summary": "Tests whether values lie inside configured lower and upper boundaries.",
        "details": [
          "Block type: native-interval-test.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Interval test",
          "caption": "Tests whether values lie inside configured lower and upper boundaries."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Inside",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Inside\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0,\"params\":[2,4,1,1],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-interval-test/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-invocation-feedback",
      "namespace": "signal",
      "slug": "signal-block-native-invocation-feedback",
      "canonicalSlug": "native-invocation-feedback",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Invocation feedback kernel",
        "label": "Invocation feedback kernel",
        "summary": "Each call reads the previous held result, runs one child and commits its new result before the next call at the same timestamp.",
        "details": [
          "Block type: native-invocation-feedback.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Invocation feedback kernel",
          "caption": "Each call reads the previous held result, runs one child and commits its new result before the next call at the same timestamp."
        },
        "inputs": [
          {
            "label": "Calls",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "outputs": [
          {
            "label": "Biased value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Invocations this sample",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[16],\"nested\":{\"type\":\"native-bias\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Biased value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1],\"tables\":[]}}},\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-invocation-feedback/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-is-hermitian",
      "namespace": "signal",
      "slug": "signal-block-native-is-hermitian",
      "canonicalSlug": "native-is-hermitian",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Is Hermitian",
        "label": "Is Hermitian",
        "summary": "Tests whether a square matrix equals its conjugate transpose within a tolerance.",
        "details": [
          "Block type: native-is-hermitian.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "matrix → operation → result",
          "label": "Is Hermitian",
          "caption": "Tests whether a square matrix equals its conjugate transpose within a tolerance."
        },
        "inputs": [
          {
            "label": "Matrix",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "complex",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "complex"
          }
        ],
        "outputs": [
          {
            "label": "Hermitian",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Matrix\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"complex\"}],\"outputs\":[{\"label\":\"Hermitian\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0,\"params\":[1e-12],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-is-hermitian/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-is-symmetric",
      "namespace": "signal",
      "slug": "signal-block-native-is-symmetric",
      "canonicalSlug": "native-is-symmetric",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Is symmetric",
        "label": "Is symmetric",
        "summary": "Tests whether a square matrix equals its transpose within a tolerance.",
        "details": [
          "Block type: native-is-symmetric.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "matrix → operation → result",
          "label": "Is symmetric",
          "caption": "Tests whether a square matrix equals its transpose within a tolerance."
        },
        "inputs": [
          {
            "label": "Matrix",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Symmetric",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Matrix\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Symmetric\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0,\"params\":[1e-12],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-is-symmetric/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-is-triangular",
      "namespace": "signal",
      "slug": "signal-block-native-is-triangular",
      "canonicalSlug": "native-is-triangular",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Is triangular",
        "label": "Is triangular",
        "summary": "Tests whether entries outside an upper or lower triangle are effectively zero.",
        "details": [
          "Block type: native-is-triangular.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "matrix → operation → result",
          "label": "Is triangular",
          "caption": "Tests whether entries outside an upper or lower triangle are effectively zero."
        },
        "inputs": [
          {
            "label": "Matrix",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Triangular",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Matrix\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Triangular\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0,\"params\":[0,1e-12],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-is-triangular/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-linear-hold",
      "namespace": "signal",
      "slug": "signal-block-native-linear-hold",
      "canonicalSlug": "native-linear-hold",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Causal first-order hold",
        "label": "Causal first-order hold",
        "summary": "Captures the latest two samples at declared ticks and extrapolates linearly between them; the first interval has zero slope.",
        "details": [
          "Block type: native-linear-hold.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → response",
          "label": "Causal first-order hold",
          "caption": "Captures the latest two samples at declared ticks and extrapolates linearly between them; the first interval has zero slope."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Linear reconstruction",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Linear reconstruction\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0.1],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-linear-hold/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-lookup-1d",
      "namespace": "signal",
      "slug": "signal-block-native-lookup-1d",
      "canonicalSlug": "native-lookup-1d",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "1-D lookup table",
        "label": "1-D lookup table",
        "summary": "Interpolates a calibration table along its input axes.",
        "details": [
          "Block type: native-lookup-1d.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "lookup",
          "symbol": "y = table(u)",
          "label": "Interpolate declared data",
          "caption": "Interpolates a calibration table along its input axes."
        },
        "inputs": [
          {
            "label": "x",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"x\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0],\"tables\":[[0,1,2],[0,10,40]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-1d/",
        "related": [
          {
            "label": "Prelookup",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-prelookup/"
          },
          {
            "label": "Lookup nd",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-nd/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-lookup-2d",
      "namespace": "signal",
      "slug": "signal-block-native-lookup-2d",
      "canonicalSlug": "native-lookup-2d",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "2-D lookup table",
        "label": "2-D lookup table",
        "summary": "Interpolates a calibration table along its input axes.",
        "details": [
          "Block type: native-lookup-2d.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "lookup",
          "symbol": "y = table(u)",
          "label": "Interpolate declared data",
          "caption": "Interpolates a calibration table along its input axes."
        },
        "inputs": [
          {
            "label": "x",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "y",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"x\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"y\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0],\"tables\":[[0,1],[0,2],[0,1,4,5]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-2d/",
        "related": [
          {
            "label": "Lookup 1d",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-1d/"
          },
          {
            "label": "Prelookup",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-prelookup/"
          },
          {
            "label": "Lookup nd",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-nd/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-lookup-nd",
      "namespace": "signal",
      "slug": "signal-block-native-lookup-nd",
      "canonicalSlug": "native-lookup-nd",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "N-D lookup table",
        "label": "N-D lookup table",
        "summary": "Interpolates a calibration table along its input axes.",
        "details": [
          "Block type: native-lookup-nd.",
          "3 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "lookup",
          "symbol": "y = table(u)",
          "label": "Interpolate declared data",
          "caption": "Interpolates a calibration table along its input axes."
        },
        "inputs": [
          {
            "label": "x",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "y",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "z",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"x\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"y\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"z\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0],\"tables\":[[0,1],[0,1],[0,1],[0,1,2,3,4,5,6,7]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-nd/",
        "related": [
          {
            "label": "Lookup 1d",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-1d/"
          },
          {
            "label": "Prelookup",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-prelookup/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-manual-switch",
      "namespace": "signal",
      "slug": "signal-block-native-manual-switch",
      "canonicalSlug": "native-manual-switch",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Manual switch",
        "label": "Manual switch",
        "summary": "Selects a configured input without changing its shape, units or element type.",
        "details": [
          "Block type: native-manual-switch.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Selects a configured input without changing its shape, units or element type."
        },
        "inputs": [
          {
            "label": "First signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "label": "Second signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Selected signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"First signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"},{\"label\":\"Second signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Selected signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[1],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-manual-switch/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-math-function",
      "namespace": "signal",
      "slug": "signal-block-native-math-function",
      "canonicalSlug": "native-math-function",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Math function",
        "label": "Math function",
        "summary": "Applies a selected square root, exponential, logarithm, square, reciprocal or absolute-value function.",
        "details": [
          "Block type: native-math-function.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Math function",
          "caption": "Applies a selected square root, exponential, logarithm, square, reciprocal or absolute-value function."
        },
        "inputs": [
          {
            "label": "Values",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Values\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-math-function/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-matrix-concatenate",
      "namespace": "signal",
      "slug": "signal-block-native-matrix-concatenate",
      "canonicalSlug": "native-matrix-concatenate",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Matrix concatenate",
        "label": "Matrix concatenate",
        "summary": "Joins two matrices along their row or column axis.",
        "details": [
          "Block type: native-matrix-concatenate.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "matrix → operation → result",
          "label": "Matrix concatenate",
          "caption": "Joins two matrices along their row or column axis."
        },
        "inputs": [
          {
            "label": "A",
            "shape": [
              2,
              1
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 1",
            "elementLabel": "real"
          },
          {
            "label": "B",
            "shape": [
              2,
              1
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 1",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"A\",\"shape\":[2,1],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"B\",\"shape\":[2,1],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-matrix-concatenate/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-matrix-multiply",
      "namespace": "signal",
      "slug": "signal-block-native-matrix-multiply",
      "canonicalSlug": "native-matrix-multiply",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Matrix multiply",
        "label": "Matrix multiply",
        "summary": "Multiplies two real matrices with compatible inner dimensions.",
        "details": [
          "Block type: native-matrix-multiply.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "A · B",
          "label": "Matrix multiplication",
          "caption": "Multiplies two real matrices with compatible inner dimensions."
        },
        "inputs": [
          {
            "label": "A",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          },
          {
            "label": "B",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Product",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"A\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"B\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Product\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-matrix-multiply/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-multiport-switch",
      "namespace": "signal",
      "slug": "signal-block-native-multiport-switch",
      "canonicalSlug": "native-multiport-switch",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Multiport switch",
        "label": "Multiport switch",
        "summary": "Routes one whole data port selected by a zero-based integer. Out-of-range indices stop the run.",
        "details": [
          "Block type: native-multiport-switch.",
          "3 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Routes one whole data port selected by a zero-based integer. Out-of-range indices stop the run."
        },
        "inputs": [
          {
            "label": "Index",
            "shape": [],
            "elementType": "i32",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "i32"
          },
          {
            "label": "First signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          },
          {
            "label": "Second signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Selected signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Index\",\"shape\":[],\"elementType\":\"i32\",\"quantity\":\"dimensionless\"},{\"label\":\"First signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"},{\"label\":\"Second signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Selected signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-multiport-switch/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-neighborhood-map",
      "namespace": "signal",
      "slug": "signal-block-native-neighborhood-map",
      "canonicalSlug": "native-neighborhood-map",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Neighborhood submodel",
        "label": "Neighborhood submodel",
        "summary": "Executes one pure nested kernel per column-major patch; explicit padding policy and a bounded work budget.",
        "details": [
          "Block type: native-neighborhood-map.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "matrix → operation → result",
          "label": "Neighborhood submodel",
          "caption": "Executes one pure nested kernel per column-major patch; explicit padding policy and a bounded work budget."
        },
        "inputs": [
          {
            "label": "Image",
            "shape": [
              3,
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3 × 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [
              3,
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3 × 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Image\",\"shape\":[3,3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[3,3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1,1,0],\"tables\":[],\"nested\":{\"type\":\"native-reduce-elements\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Values\",\"shape\":[9],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1],\"tables\":[]}}}}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-neighborhood-map/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-normal-random",
      "namespace": "signal",
      "slug": "signal-block-native-normal-random",
      "canonicalSlug": "native-normal-random",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Normal random source",
        "label": "Normal random source",
        "summary": "Produces reproducible Box–Muller Gaussian samples and holds them at the declared sample period.",
        "details": [
          "Block type: native-normal-random.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Produces reproducible Box–Muller Gaussian samples and holds them at the declared sample period."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Signal",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "source",
            "label": "Signal profile",
            "unit": "",
            "value": "{\"outputs\":[{\"label\":\"Signal\",\"quantity\":\"inherit\",\"shape\":[],\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[1,0,1],\"times\":[],\"values\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-normal-random/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-parameter-writer",
      "namespace": "signal",
      "slug": "signal-block-native-parameter-writer",
      "canonicalSlug": "native-parameter-writer",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Scoped parameter writer",
        "label": "Scoped parameter writer",
        "summary": "Writes a stored parameter of one declared child at accepted samples, then executes that child with the updated parameter.",
        "details": [
          "Block type: native-parameter-writer.",
          "3 declared inputs and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Scoped parameter writer",
          "caption": "Writes a stored parameter of one declared child at accepted samples, then executes that child with the updated parameter."
        },
        "inputs": [
          {
            "label": "Value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "New parameter value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Write enabled",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Scaled",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Applied parameter value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Write accepted",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "out2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[],\"nested\":{\"type\":\"native-adjustable-gain\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Scaled\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[2],\"tables\":[]}}},\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-parameter-writer/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-parts-complex",
      "namespace": "signal",
      "slug": "signal-block-native-parts-complex",
      "canonicalSlug": "native-parts-complex",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Real and imaginary to complex",
        "label": "Real and imaginary to complex",
        "summary": "Constructs complex values from separate real and imaginary inputs.",
        "details": [
          "Block type: native-parts-complex.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Real and imaginary to complex",
          "caption": "Constructs complex values from separate real and imaginary inputs."
        },
        "inputs": [
          {
            "label": "Real",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          },
          {
            "label": "Imaginary",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Complex",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "complex",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "complex"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Real\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Imaginary\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Complex\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"complex\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-parts-complex/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-permute-dimensions",
      "namespace": "signal",
      "slug": "signal-block-native-permute-dimensions",
      "canonicalSlug": "native-permute-dimensions",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Permute array dimensions",
        "label": "Permute array dimensions",
        "summary": "Reorders array axes while preserving each element’s coordinates.",
        "details": [
          "Block type: native-permute-dimensions.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Permute array dimensions",
          "caption": "Reorders array axes while preserving each element’s coordinates."
        },
        "inputs": [
          {
            "label": "Values",
            "shape": [
              2,
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [
              3,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3 × 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Values\",\"shape\":[2,3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[3,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1,0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-permute-dimensions/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-permute-matrix",
      "namespace": "signal",
      "slug": "signal-block-native-permute-matrix",
      "canonicalSlug": "native-permute-matrix",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Permute matrix rows and columns",
        "label": "Permute matrix rows and columns",
        "summary": "Reorders complete matrix rows and columns using explicit permutations.",
        "details": [
          "Block type: native-permute-matrix.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "matrix → operation → result",
          "label": "Permute matrix rows and columns",
          "caption": "Reorders complete matrix rows and columns using explicit permutations."
        },
        "inputs": [
          {
            "label": "Matrix",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Matrix\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[[1,0],[0,1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-permute-matrix/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-pid",
      "namespace": "signal",
      "slug": "signal-block-native-pid",
      "canonicalSlug": "native-pid",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Continuous weighted PID",
        "label": "Continuous weighted PID",
        "summary": "Combines continuous proportional, integral and filtered derivative control with weights and limits.",
        "details": [
          "Block type: native-pid.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "P + I + filtered D",
          "label": "Continuous PID control",
          "caption": "Combines continuous proportional, integral and filtered derivative control with weights and limits."
        },
        "inputs": [
          {
            "label": "Setpoint",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Measurement",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Control",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Setpoint\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Measurement\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Control\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1,0.5,0,0.1,-10,10,1,0],\"tables\":[[0,0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pid/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-pixel-map",
      "namespace": "signal",
      "slug": "signal-block-native-pixel-map",
      "canonicalSlug": "native-pixel-map",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Pixel channel submodel",
        "label": "Pixel channel submodel",
        "summary": "Executes a pure nested kernel on each pixel channel vector. Channel planes use column-major storage.",
        "details": [
          "Block type: native-pixel-map.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "matrix → operation → result",
          "label": "Pixel channel submodel",
          "caption": "Executes a pure nested kernel on each pixel channel vector. Channel planes use column-major storage."
        },
        "inputs": [
          {
            "label": "Image channels",
            "shape": [
              2,
              2,
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2 × 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Mean channel",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Image channels\",\"shape\":[2,2,3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Mean channel\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[],\"nested\":{\"type\":\"native-reduce-elements\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Values\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1],\"tables\":[]}}}}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pixel-map/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-playback",
      "namespace": "signal",
      "slug": "signal-block-native-playback",
      "canonicalSlug": "native-playback",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Recorded signal",
        "label": "Recorded signal",
        "summary": "Plays a local numeric time series with linear interpolation or previous-value hold. Values outside its time range hold the nearest endpoint.",
        "details": [
          "Block type: native-playback.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Plays a local numeric time series with linear interpolation or previous-value hold. Values outside its time range hold the nearest endpoint."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Signal",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "source",
            "label": "Signal profile",
            "unit": "",
            "value": "{\"outputs\":[{\"label\":\"Signal\",\"quantity\":\"inherit\",\"shape\":[],\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0,0],\"times\":[0,0.5,1],\"values\":[0,2,0]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-playback/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-polar-complex",
      "namespace": "signal",
      "slug": "signal-block-native-polar-complex",
      "canonicalSlug": "native-polar-complex",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Magnitude and angle to complex",
        "label": "Magnitude and angle to complex",
        "summary": "Constructs complex values from nonnegative magnitudes and phase angles.",
        "details": [
          "Block type: native-polar-complex.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Magnitude and angle to complex",
          "caption": "Constructs complex values from nonnegative magnitudes and phase angles."
        },
        "inputs": [
          {
            "label": "Magnitude",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          },
          {
            "label": "Angle",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Complex",
            "shape": [
              1
            ],
            "quantity": "dimensionless",
            "elementType": "complex",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "complex"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Magnitude\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Angle\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Complex\",\"shape\":[1],\"quantity\":\"inherit\",\"elementType\":\"complex\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-polar-complex/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-polynomial",
      "namespace": "signal",
      "slug": "signal-block-native-polynomial",
      "canonicalSlug": "native-polynomial",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Polynomial",
        "label": "Polynomial",
        "summary": "Evaluates a polynomial whose coefficients are supplied in descending powers.",
        "details": [
          "Block type: native-polynomial.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "p(u)",
          "label": "Evaluate the configured polynomial",
          "caption": "Evaluates a polynomial whose coefficients are supplied in descending powers."
        },
        "inputs": [
          {
            "label": "x",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Polynomial value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"x\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Polynomial value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[[2,-3,1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-polynomial/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-prelookup",
      "namespace": "signal",
      "slug": "signal-block-native-prelookup",
      "canonicalSlug": "native-prelookup",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Prelookup",
        "label": "Prelookup",
        "summary": "Locates a breakpoint interval and computes the input’s fraction within it.",
        "details": [
          "Block type: native-prelookup.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "lookup",
          "symbol": "y = table(u)",
          "label": "Interpolate declared data",
          "caption": "Locates a breakpoint interval and computes the input’s fraction within it."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Cell index",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          },
          {
            "label": "Fraction",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Cell index\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"},{\"label\":\"Fraction\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0],\"tables\":[[0,10,20]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-prelookup/",
        "related": [
          {
            "label": "Lookup 1d",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-1d/"
          },
          {
            "label": "Lookup nd",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-nd/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-product-elements",
      "namespace": "signal",
      "slug": "signal-block-native-product-elements",
      "canonicalSlug": "native-product-elements",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Product of elements",
        "label": "Product of elements",
        "summary": "Multiplies all elements of an input array.",
        "details": [
          "Block type: native-product-elements.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Product of elements",
          "caption": "Multiplies all elements of an input array."
        },
        "inputs": [
          {
            "label": "Values",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Product",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Values\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Product\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-product-elements/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-propagation-delay",
      "namespace": "signal",
      "slug": "signal-block-native-propagation-delay",
      "canonicalSlug": "native-propagation-delay",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Boolean transport propagation delay",
        "label": "Boolean transport propagation delay",
        "summary": "Time-stamped transport delay preserves accepted Boolean transitions; no inertial pulse rejection.",
        "details": [
          "Block type: native-propagation-delay.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Time-stamped transport delay preserves accepted Boolean transitions; no inertial pulse rejection."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Delayed",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"outputs\":[{\"label\":\"Delayed\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0,\"params\":[0.2,1024],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-propagation-delay/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-pulse",
      "namespace": "signal",
      "slug": "signal-block-native-pulse",
      "canonicalSlug": "native-pulse",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Pulse generator",
        "label": "Pulse generator",
        "summary": "Generates a periodic rectangular signal with explicit amplitude, duty fraction, phase delay and bias.",
        "details": [
          "Block type: native-pulse.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Generates a periodic rectangular signal with explicit amplitude, duty fraction, phase delay and bias."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Signal",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "source",
            "label": "Signal profile",
            "unit": "",
            "value": "{\"outputs\":[{\"label\":\"Signal\",\"quantity\":\"inherit\",\"shape\":[],\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[2,1,0.5,0,0],\"times\":[],\"values\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-quantized-sine",
      "namespace": "signal",
      "slug": "signal-block-native-quantized-sine",
      "canonicalSlug": "native-quantized-sine",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Quantized sine in cycles",
        "label": "Quantized sine in cycles",
        "summary": "Evaluates a sine from phase in cycles and rounds its value to 14 fractional bits.",
        "details": [
          "Block type: native-quantized-sine.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "lookup",
          "symbol": "y = table(u)",
          "label": "Interpolate declared data",
          "caption": "Evaluates a sine from phase in cycles and rounds its value to 14 fractional bits."
        },
        "inputs": [
          {
            "label": "Cycles",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Sine",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Cycles\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Sine\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-quantized-sine/",
        "related": [
          {
            "label": "Lookup 1d",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-1d/"
          },
          {
            "label": "Prelookup",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-prelookup/"
          },
          {
            "label": "Lookup nd",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-lookup-nd/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-quantizer",
      "namespace": "signal",
      "slug": "signal-block-native-quantizer",
      "canonicalSlug": "native-quantizer",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Quantizer",
        "label": "Quantizer",
        "summary": "Rounds values to the nearest multiple of a configured interval.",
        "details": [
          "Block type: native-quantizer.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Quantizer",
          "caption": "Rounds values to the nearest multiple of a configured interval."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Quantized",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Quantized\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0.25],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-quantizer/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-ramp",
      "namespace": "signal",
      "slug": "signal-block-native-ramp",
      "canonicalSlug": "native-ramp",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Ramp",
        "label": "Ramp",
        "summary": "Produces a linearly changing value after a configured start time.",
        "details": [
          "Block type: native-ramp.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Produces a linearly changing value after a configured start time."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[],\"outputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0,1,0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-ramp/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-rate-transition",
      "namespace": "signal",
      "slug": "signal-block-native-rate-transition",
      "canonicalSlug": "native-rate-transition",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Rate transition",
        "label": "Rate transition",
        "summary": "Samples a whole input at its declared period and holds the complete value between instants on the deterministic simulation clock.",
        "details": [
          "Block type: native-rate-transition.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Rate transition",
          "caption": "Samples a whole input at its declared period and holds the complete value between instants on the deterministic simulation clock."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Held output",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Held output\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0.1}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-rate-transition/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-recorder",
      "namespace": "signal",
      "slug": "signal-block-native-recorder",
      "canonicalSlug": "native-recorder",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Signal recorder",
        "label": "Signal recorder",
        "summary": "Records the connected signal on the solver trace grid and exports its times, typed metadata and values as CSV or JSON.",
        "details": [
          "Block type: native-recorder.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Signal recorder",
          "caption": "Records the connected signal on the solver trace grid and exports its times, typed metadata and values as CSV or JSON."
        },
        "inputs": [
          {
            "label": "Signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Recorded signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Recorded signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-recorder/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-reduce-elements",
      "namespace": "signal",
      "slug": "signal-block-native-reduce-elements",
      "canonicalSlug": "native-reduce-elements",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sum or mean of elements",
        "label": "Sum or mean of elements",
        "summary": "Reduces an array to its sum or arithmetic mean.",
        "details": [
          "Block type: native-reduce-elements.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Sum or mean of elements",
          "caption": "Reduces an array to its sum or arithmetic mean."
        },
        "inputs": [
          {
            "label": "Values",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Values\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-reduce-elements/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-repeating-sequence",
      "namespace": "signal",
      "slug": "signal-block-native-repeating-sequence",
      "canonicalSlug": "native-repeating-sequence",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Repeating sequence",
        "label": "Repeating sequence",
        "summary": "Repeats a tabulated profile with exact simulation boundaries at every authored knot and wrap.",
        "details": [
          "Block type: native-repeating-sequence.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Repeats a tabulated profile with exact simulation boundaries at every authored knot and wrap."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Signal",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "source",
            "label": "Signal profile",
            "unit": "",
            "value": "{\"outputs\":[{\"label\":\"Signal\",\"quantity\":\"inherit\",\"shape\":[],\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0,1],\"times\":[0,0.5,1],\"values\":[0,2,0]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-repeating-sequence/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-resettable-delay",
      "namespace": "signal",
      "slug": "signal-block-native-resettable-delay",
      "canonicalSlug": "native-resettable-delay",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Resettable sample delay",
        "label": "Resettable sample delay",
        "summary": "Returns the previous sample or resets its stored value on a Boolean command.",
        "details": [
          "Block type: native-resettable-delay.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Returns the previous sample or resets its stored value on a Boolean command."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Reset",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Delayed",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Reset\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"outputs\":[{\"label\":\"Delayed\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[2]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-resettable-delay/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-resettable-minmax",
      "namespace": "signal",
      "slug": "signal-block-native-resettable-minmax",
      "canonicalSlug": "native-resettable-minmax",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Resettable running minimum and maximum",
        "label": "Resettable running minimum and maximum",
        "summary": "Tracks running extrema and resets both to the current value on command.",
        "details": [
          "Block type: native-resettable-minmax.",
          "2 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Resettable running minimum and maximum",
          "caption": "Tracks running extrema and resets both to the current value on command."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Reset",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Minimum",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Maximum",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Reset\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"outputs\":[{\"label\":\"Minimum\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Maximum\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-resettable-minmax/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-resettable-submodel",
      "namespace": "signal",
      "slug": "signal-block-native-resettable-submodel",
      "canonicalSlug": "native-resettable-submodel",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Resettable kernel",
        "label": "Resettable kernel",
        "summary": "Restores the child initial memory before executing on a reset edge. Other samples execute normally.",
        "details": [
          "Block type: native-resettable-submodel.",
          "2 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Resettable kernel",
          "caption": "Restores the child initial memory before executing on a reset edge. Other samples execute normally."
        },
        "inputs": [
          {
            "label": "Value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Reset",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Integral",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Invocations this sample",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[0,0],\"nested\":{\"type\":\"native-discrete-integrator\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Integral\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":1,\"params\":[1,-1000000000,1000000000],\"tables\":[[0]]}}},\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-resettable-submodel/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-reshape",
      "namespace": "signal",
      "slug": "signal-block-native-reshape",
      "canonicalSlug": "native-reshape",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Reshape array",
        "label": "Reshape array",
        "summary": "Changes an array’s dimensions while preserving its element order.",
        "details": [
          "Block type: native-reshape.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "same elements → new shape",
          "label": "Change array dimensions",
          "caption": "Changes an array’s dimensions while preserving its element order."
        },
        "inputs": [
          {
            "label": "Values",
            "shape": [
              4
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 4",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Matrix",
            "shape": [
              2,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Values\",\"shape\":[4],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Matrix\",\"shape\":[2,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-reshape/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-rise-nonnegative",
      "namespace": "signal",
      "slug": "signal-block-native-rise-nonnegative",
      "canonicalSlug": "native-rise-nonnegative",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Detect rise nonnegative",
        "label": "Detect rise nonnegative",
        "summary": "Reports a sampled crossing from negative into zero or positive values.",
        "details": [
          "Block type: native-rise-nonnegative.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Detect rise nonnegative",
          "caption": "Reports a sampled crossing from negative into zero or positive values."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Detected",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Detected\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[-1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-rise-nonnegative/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-rise-positive",
      "namespace": "signal",
      "slug": "signal-block-native-rise-positive",
      "canonicalSlug": "native-rise-positive",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Detect rise positive",
        "label": "Detect rise positive",
        "summary": "Reports a sampled crossing from zero or negative into positive values.",
        "details": [
          "Block type: native-rise-positive.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Detect rise positive",
          "caption": "Reports a sampled crossing from zero or negative into positive values."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Detected",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Detected\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-rise-positive/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-rising-edge",
      "namespace": "signal",
      "slug": "signal-block-native-rising-edge",
      "canonicalSlug": "native-rising-edge",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Detect rising edge",
        "label": "Detect rising edge",
        "summary": "Reports a Boolean transition from false to true.",
        "details": [
          "Block type: native-rising-edge.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Detect rising edge",
          "caption": "Reports a Boolean transition from false to true."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Detected",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"outputs\":[{\"label\":\"Detected\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-rising-edge/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-rounding",
      "namespace": "signal",
      "slug": "signal-block-native-rounding",
      "canonicalSlug": "native-rounding",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Rounding",
        "label": "Rounding",
        "summary": "Rounds each value using floor, ceiling, truncation or nearest rounding.",
        "details": [
          "Block type: native-rounding.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Rounding",
          "caption": "Rounds each value using floor, ceiling, truncation or nearest rounding."
        },
        "inputs": [
          {
            "label": "Values",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Rounded",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Values\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Rounded\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-rounding/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-running-minmax",
      "namespace": "signal",
      "slug": "signal-block-native-running-minmax",
      "canonicalSlug": "native-running-minmax",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Running minimum and maximum",
        "label": "Running minimum and maximum",
        "summary": "Tracks the smallest and largest observed values for each input element.",
        "details": [
          "Block type: native-running-minmax.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Running minimum and maximum",
          "caption": "Tracks the smallest and largest observed values for each input element."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Minimum",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Maximum",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Minimum\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Maximum\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-running-minmax/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-sample-hold",
      "namespace": "signal",
      "slug": "signal-block-native-sample-hold",
      "canonicalSlug": "native-sample-hold",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Zero-order hold",
        "label": "Zero-order hold",
        "summary": "Captures the input at sample ticks and holds it unchanged between them.",
        "details": [
          "Block type: native-sample-hold.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Captures the input at sample ticks and holds it unchanged between them."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Held",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Held\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-sample-hold/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-sample-time-math",
      "namespace": "signal",
      "slug": "signal-block-native-sample-time-math",
      "canonicalSlug": "native-sample-time-math",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Weighted sample time math",
        "label": "Weighted sample time math",
        "summary": "Multiplies or divides a signal by an explicitly configured weighted sample period.",
        "details": [
          "Block type: native-sample-time-math.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Weighted sample time math",
          "caption": "Multiplies or divides a signal by an explicitly configured weighted sample period."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0.1,2,0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-sample-time-math/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-sampled-backlash",
      "namespace": "signal",
      "slug": "signal-block-native-sampled-backlash",
      "canonicalSlug": "native-sampled-backlash",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sampled backlash",
        "label": "Sampled backlash",
        "summary": "Models a sampled mechanical deadband whose output retains its previous position inside the gap.",
        "details": [
          "Block type: native-sampled-backlash.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Sampled backlash",
          "caption": "Models a sampled mechanical deadband whose output retains its previous position inside the gap."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[2],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-sampled-backlash/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-sampled-rate-limiter",
      "namespace": "signal",
      "slug": "signal-block-native-sampled-rate-limiter",
      "canonicalSlug": "native-sampled-rate-limiter",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sampled rate limiter",
        "label": "Sampled rate limiter",
        "summary": "Limits how quickly each sampled output can rise or fall.",
        "details": [
          "Block type: native-sampled-rate-limiter.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Sampled rate limiter",
          "caption": "Limits how quickly each sampled output can rise or fall."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Limited",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Limited\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[2,3],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-sampled-rate-limiter/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-sampled-relay",
      "namespace": "signal",
      "slug": "signal-block-native-sampled-relay",
      "canonicalSlug": "native-sampled-relay",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sampled hysteresis relay",
        "label": "Sampled hysteresis relay",
        "summary": "Switches between two output levels using separate on and off thresholds.",
        "details": [
          "Block type: native-sampled-relay.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Sampled hysteresis relay",
          "caption": "Switches between two output levels using separate on and off thresholds."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[2,1,5,0],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-sampled-relay/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-scope",
      "namespace": "signal",
      "slug": "signal-block-native-scope",
      "canonicalSlug": "native-scope",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Signal scope",
        "label": "Signal scope",
        "summary": "Plots the connected signal from the engine trace. Every array element has its own named trace channel.",
        "details": [
          "Block type: native-scope.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Signal scope",
          "caption": "Plots the connected signal from the engine trace. Every array element has its own named trace channel."
        },
        "inputs": [
          {
            "label": "Signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Observed signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Observed signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-scope/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-second-order-integrator",
      "namespace": "signal",
      "slug": "signal-block-native-second-order-integrator",
      "canonicalSlug": "native-second-order-integrator",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Second-order integrator",
        "label": "Second-order integrator",
        "summary": "Integrates acceleration into velocity and position.",
        "details": [
          "Block type: native-second-order-integrator.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Integrates acceleration into velocity and position."
        },
        "inputs": [
          {
            "label": "Acceleration",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Position",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Velocity",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Acceleration\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Position\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Velocity\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[[0],[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-second-order-integrator/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-selector",
      "namespace": "signal",
      "slug": "signal-block-native-selector",
      "canonicalSlug": "native-selector",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Element selector",
        "label": "Element selector",
        "summary": "Selects column-major array elements by explicit zero-based indices, preserving their order and type.",
        "details": [
          "Block type: native-selector.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Selects column-major array elements by explicit zero-based indices, preserving their order and type."
        },
        "inputs": [
          {
            "label": "Array",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Selected elements",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Array\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Selected elements\",\"shape\":[2],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[2,0],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-selector/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-signal-specification",
      "namespace": "signal",
      "slug": "signal-block-native-signal-specification",
      "canonicalSlug": "native-signal-specification",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Signal specification",
        "label": "Signal specification",
        "summary": "Requires an exact shape, quantity and element type at a named boundary.",
        "details": [
          "Block type: native-signal-specification.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Signal specification",
          "caption": "Requires an exact shape, quantity and element type at a named boundary."
        },
        "inputs": [
          {
            "label": "Signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Validated signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Validated signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-signal-specification/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-signal-width",
      "namespace": "signal",
      "slug": "signal-block-native-signal-width",
      "canonicalSlug": "native-signal-width",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Signal width",
        "label": "Signal width",
        "summary": "Reports the declared number of elements in a signal, including all matrix dimensions.",
        "details": [
          "Block type: native-signal-width.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Signal width",
          "caption": "Reports the declared number of elements in a signal, including all matrix dimensions."
        },
        "inputs": [
          {
            "label": "Signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Element count",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Element count\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-signal-width/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-sine",
      "namespace": "signal",
      "slug": "signal-block-native-sine",
      "canonicalSlug": "native-sine",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sine source",
        "label": "Sine source",
        "summary": "Produces a sinusoidal signal with configurable amplitude, frequency, phase and bias.",
        "details": [
          "Block type: native-sine.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Produces a sinusoidal signal with configurable amplitude, frequency, phase and bias."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[],\"outputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1,1,0,0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-sine/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-sine-function",
      "namespace": "signal",
      "slug": "signal-block-native-sine-function",
      "canonicalSlug": "native-sine-function",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sine wave function",
        "label": "Sine wave function",
        "summary": "Evaluates a sinusoid using a connected time value.",
        "details": [
          "Block type: native-sine-function.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Sine wave function",
          "caption": "Evaluates a sinusoid using a connected time value."
        },
        "inputs": [
          {
            "label": "Time",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Sine",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Time\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Sine\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[2,1,0,1],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-sine-function/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-squeeze",
      "namespace": "signal",
      "slug": "signal-block-native-squeeze",
      "canonicalSlug": "native-squeeze",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Remove singleton dimensions",
        "label": "Remove singleton dimensions",
        "summary": "Removes dimensions of size one without moving array elements.",
        "details": [
          "Block type: native-squeeze.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Remove singleton dimensions",
          "caption": "Removes dimensions of size one without moving array elements."
        },
        "inputs": [
          {
            "label": "Values",
            "shape": [
              1,
              2,
              1
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1 × 2 × 1",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Values\",\"shape\":[1,2,1],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-squeeze/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-state-reader",
      "namespace": "signal",
      "slug": "signal-block-native-state-reader",
      "canonicalSlug": "native-state-reader",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Scoped state reader",
        "label": "Scoped state reader",
        "summary": "Executes one declared discrete state-space child and records its actual internal state before and after each update.",
        "details": [
          "Block type: native-state-reader.",
          "1 declared input and 3 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Scoped state reader",
          "caption": "Executes one declared discrete state-space child and records its actual internal state before and after each update."
        },
        "inputs": [
          {
            "label": "Input",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "State before update",
            "quantity": "dimensionless",
            "shape": [
              1
            ],
            "elementType": "real",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          },
          {
            "label": "State after update",
            "quantity": "dimensionless",
            "shape": [
              1
            ],
            "elementType": "real",
            "id": "out2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[],\"nested\":{\"type\":\"native-discrete-state-space\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":1,\"params\":[1],\"tables\":[[0.5],[1],[2],[3],[4]]}}},\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-state-reader/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-state-space",
      "namespace": "signal",
      "slug": "signal-block-native-state-space",
      "canonicalSlug": "native-state-space",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Continuous state space",
        "label": "Continuous state space",
        "summary": "Simulates a continuous linear state model with configurable A, B, C and D matrices.",
        "details": [
          "Block type: native-state-space.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "ẋ = Ax + Bu",
          "label": "Continuous state model",
          "caption": "Simulates a continuous linear state model with configurable A, B, C and D matrices."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[1],\"tables\":[[-1],[1],[1],[0],[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-state-space/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-state-writer",
      "namespace": "signal",
      "slug": "signal-block-native-state-writer",
      "canonicalSlug": "native-state-writer",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Scoped state writer",
        "label": "Scoped state writer",
        "summary": "Replaces a declared discrete state-space child state on an enabled write, then evaluates output and advances that state at the accepted sample.",
        "details": [
          "Block type: native-state-writer.",
          "3 declared inputs and 4 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Scoped state writer",
          "caption": "Replaces a declared discrete state-space child state on an enabled write, then evaluates output and advances that state at the accepted sample."
        },
        "inputs": [
          {
            "label": "Input",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Replacement state",
            "quantity": "dimensionless",
            "shape": [
              1
            ],
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          },
          {
            "label": "Write enabled",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "in2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "State before update",
            "quantity": "dimensionless",
            "shape": [
              1
            ],
            "elementType": "real",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          },
          {
            "label": "State after update",
            "quantity": "dimensionless",
            "shape": [
              1
            ],
            "elementType": "real",
            "id": "out2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1",
            "elementLabel": "real"
          },
          {
            "label": "Write accepted",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "out3",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[],\"nested\":{\"type\":\"native-discrete-state-space\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":1,\"params\":[1],\"tables\":[[0.5],[1],[2],[3],[4]]}}},\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-state-writer/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-step",
      "namespace": "signal",
      "slug": "signal-block-native-step",
      "canonicalSlug": "native-step",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Array step",
        "label": "Array step",
        "summary": "Changes an entire signal from its before value to its after value at an exact time.",
        "details": [
          "Block type: native-step.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Changes an entire signal from its before value to its after value at an exact time."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[],\"outputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0.5],\"tables\":[[0],[1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-step/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-step-memory",
      "namespace": "signal",
      "slug": "signal-block-native-step-memory",
      "canonicalSlug": "native-step-memory",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Accepted solver-step memory",
        "label": "Accepted solver-step memory",
        "summary": "Stores input only at accepted major steps. Rejected solver trials never alter memory.",
        "details": [
          "Block type: native-step-memory.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Stores input only at accepted major steps. Rejected solver trials never alter memory."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Previous accepted input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Previous accepted input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-step-memory/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-stop-simulation",
      "namespace": "signal",
      "slug": "signal-block-native-stop-simulation",
      "canonicalSlug": "native-stop-simulation",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Stop simulation",
        "label": "Stop simulation",
        "summary": "Finishes the run successfully at the first sample where the Boolean condition is true, preserving the trace and recording the stop reason.",
        "details": [
          "Block type: native-stop-simulation.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Stop simulation",
          "caption": "Finishes the run successfully at the first sample where the Boolean condition is true, preserving the trace and recording the stop reason."
        },
        "inputs": [
          {
            "label": "Stop requested",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Stop accepted",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Stop requested\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Stop accepted\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0.1}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-stop-simulation/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-submatrix",
      "namespace": "signal",
      "slug": "signal-block-native-submatrix",
      "canonicalSlug": "native-submatrix",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Extract submatrix",
        "label": "Extract submatrix",
        "summary": "Selects matrix rows and columns to form a smaller matrix.",
        "details": [
          "Block type: native-submatrix.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "matrix → operation → result",
          "label": "Extract submatrix",
          "caption": "Selects matrix rows and columns to form a smaller matrix."
        },
        "inputs": [
          {
            "label": "Matrix",
            "shape": [
              2,
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [
              1,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 1 × 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Matrix\",\"shape\":[2,3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[1,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[[1],[0,2]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-submatrix/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-switch-case-actions",
      "namespace": "signal",
      "slug": "signal-block-native-switch-case-actions",
      "canonicalSlug": "native-switch-case-actions",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Case action router",
        "label": "Case action router",
        "summary": "Routes an integer mode to exactly one configured case flag or the final default flag, without fall-through.",
        "details": [
          "Block type: native-switch-case-actions.",
          "1 declared input and 4 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Routes an integer mode to exactly one configured case flag or the final default flag, without fall-through."
        },
        "inputs": [
          {
            "label": "Case",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "i32",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "i32"
          }
        ],
        "outputs": [
          {
            "label": "Case 0",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "label": "Case 1",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "label": "Case 2",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "out2",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          },
          {
            "label": "Default",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "out3",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[0,1,2],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-switch-case-actions/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-tapped-delay",
      "namespace": "signal",
      "slug": "signal-block-native-tapped-delay",
      "canonicalSlug": "native-tapped-delay",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Tapped sample delay",
        "label": "Tapped sample delay",
        "summary": "Returns several previous samples simultaneously, newest first.",
        "details": [
          "Block type: native-tapped-delay.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Returns several previous samples simultaneously, newest first."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Previous samples",
            "shape": [
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Previous samples\",\"shape\":[3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[3],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-tapped-delay/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-terminator",
      "namespace": "signal",
      "slug": "signal-block-native-terminator",
      "canonicalSlug": "native-terminator",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Signal terminator",
        "label": "Signal terminator",
        "summary": "Consumes a declared signal without forwarding its numeric value. The connected flag confirms that validation and execution succeeded.",
        "details": [
          "Block type: native-terminator.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Signal terminator",
          "caption": "Consumes a declared signal without forwarding its numeric value. The connected flag confirms that validation and execution succeeded."
        },
        "inputs": [
          {
            "label": "Unused signal",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Connected",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Unused signal\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Connected\",\"shape\":[],\"elementType\":\"bool\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-terminator/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-time",
      "namespace": "signal",
      "slug": "signal-block-native-time",
      "canonicalSlug": "native-time",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Simulation time",
        "label": "Simulation time",
        "summary": "Exposes the current simulation time as a signal.",
        "details": [
          "Block type: native-time.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Exposes the current simulation time as a signal."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Time",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[],\"outputs\":[{\"label\":\"Time\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-time/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-transfer-function",
      "namespace": "signal",
      "slug": "signal-block-native-transfer-function",
      "canonicalSlug": "native-transfer-function",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Continuous transfer function",
        "label": "Continuous transfer function",
        "summary": "Simulates a proper continuous transfer function using companion states.",
        "details": [
          "Block type: native-transfer-function.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Simulates a proper continuous transfer function using companion states."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[[1],[1,1],[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-transfer-function/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-transport-delay",
      "namespace": "signal",
      "slug": "signal-block-native-transport-delay",
      "canonicalSlug": "native-transport-delay",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Continuous transport delay",
        "label": "Continuous transport delay",
        "summary": "Interpolates immutable accepted-step history. Fixed-delay source discontinuities are propagated exactly.",
        "details": [
          "Block type: native-transport-delay.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Interpolates immutable accepted-step history. Fixed-delay source discontinuities are propagated exactly."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Delayed",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Delayed\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0.2,1024],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-transport-delay/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-transpose",
      "namespace": "signal",
      "slug": "signal-block-native-transpose",
      "canonicalSlug": "native-transpose",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Matrix transpose",
        "label": "Matrix transpose",
        "summary": "Exchanges matrix rows and columns without conjugating complex values.",
        "details": [
          "Block type: native-transpose.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "A → Aᵀ",
          "label": "Exchange rows and columns",
          "caption": "Exchanges matrix rows and columns without conjugating complex values."
        },
        "inputs": [
          {
            "label": "Matrix",
            "shape": [
              2,
              3
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2 × 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Transposed",
            "shape": [
              3,
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3 × 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Matrix\",\"shape\":[2,3],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Transposed\",\"shape\":[3,2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-transpose/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-triggered-submodel",
      "namespace": "signal",
      "slug": "signal-block-native-triggered-submodel",
      "canonicalSlug": "native-triggered-submodel",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Triggered kernel",
        "label": "Triggered kernel",
        "summary": "Captures child inputs only on the configured Boolean edge, with explicit previous-trigger initialization.",
        "details": [
          "Block type: native-triggered-submodel.",
          "2 declared inputs and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Triggered kernel",
          "caption": "Captures child inputs only on the configured Boolean edge, with explicit previous-trigger initialization."
        },
        "inputs": [
          {
            "label": "Value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Trigger",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "bool",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Scaled",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Invocations this sample",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[0,0],\"nested\":{\"type\":\"native-adjustable-gain\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Scaled\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[2],\"tables\":[]}}},\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-triggered-submodel/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-trigonometric",
      "namespace": "signal",
      "slug": "signal-block-native-trigonometric",
      "canonicalSlug": "native-trigonometric",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Trigonometric function",
        "label": "Trigonometric function",
        "summary": "Applies a selected trigonometric, inverse-trigonometric or hyperbolic function.",
        "details": [
          "Block type: native-trigonometric.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Trigonometric function",
          "caption": "Applies a selected trigonometric, inverse-trigonometric or hyperbolic function."
        },
        "inputs": [
          {
            "label": "Angles",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Angles\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-trigonometric/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-truth-table",
      "namespace": "signal",
      "slug": "signal-block-native-truth-table",
      "canonicalSlug": "native-truth-table",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Truth table",
        "label": "Truth table",
        "summary": "Uses a Boolean input pattern to select a configured truth-table result.",
        "details": [
          "Block type: native-truth-table.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "input → condition → result",
          "label": "Truth table",
          "caption": "Uses a Boolean input pattern to select a configured truth-table result."
        },
        "inputs": [
          {
            "label": "Inputs",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "bool"
          }
        ],
        "outputs": [
          {
            "label": "Result",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Inputs\",\"shape\":[2],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"outputs\":[{\"label\":\"Result\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[[0,1,1,0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-truth-table/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-type-conversion",
      "namespace": "signal",
      "slug": "signal-block-native-type-conversion",
      "canonicalSlug": "native-type-conversion",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Numeric type conversion",
        "label": "Numeric type conversion",
        "summary": "Converts real, Boolean or 32-bit integer elements. Integer conversion truncates toward zero and saturates at the target bounds.",
        "details": [
          "Block type: native-type-conversion.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Numeric type conversion",
          "caption": "Converts real, Boolean or 32-bit integer elements. Integer conversion truncates toward zero and saturates at the target bounds."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Integer output",
            "shape": [
              3
            ],
            "elementType": "i32",
            "quantity": "dimensionless",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 3",
            "elementLabel": "i32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[3],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Integer output\",\"shape\":[3],\"elementType\":\"i32\",\"quantity\":\"dimensionless\"}],\"params\":[],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-type-conversion/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-uniform-random",
      "namespace": "signal",
      "slug": "signal-block-native-uniform-random",
      "canonicalSlug": "native-uniform-random",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Uniform random source",
        "label": "Uniform random source",
        "summary": "Produces reproducible uniform samples from a nonzero 32-bit seed and holds each sample until the next instant.",
        "details": [
          "Block type: native-uniform-random.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Produces reproducible uniform samples from a nonzero 32-bit seed and holds each sample until the next instant."
        },
        "inputs": [],
        "outputs": [
          {
            "label": "Signal",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "source",
            "label": "Signal profile",
            "unit": "",
            "value": "{\"outputs\":[{\"label\":\"Signal\",\"quantity\":\"inherit\",\"shape\":[],\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[1,0,1],\"times\":[],\"values\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-uniform-random/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-unit-conversion",
      "namespace": "signal",
      "slug": "signal-block-native-unit-conversion",
      "canonicalSlug": "native-unit-conversion",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Explicit unit conversion",
        "label": "Explicit unit conversion",
        "summary": "Applies output = scale × input + offset. The worked example converts an external Celsius number into a Kelvin temperature port.",
        "details": [
          "Block type: native-unit-conversion.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Explicit unit conversion",
          "caption": "Applies output = scale × input + offset. The worked example converts an external Celsius number into a Kelvin temperature port."
        },
        "inputs": [
          {
            "label": "Temperature in Celsius",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Temperature in Kelvin",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature",
            "id": "out0",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Temperature in Celsius\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Temperature in Kelvin\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"temperature\"}],\"params\":[1,273.15],\"sampleTimeS\":0}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-unit-conversion/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-variable-delay",
      "namespace": "signal",
      "slug": "signal-block-native-variable-delay",
      "canonicalSlug": "native-variable-delay",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Variable integer delay",
        "label": "Variable integer delay",
        "summary": "Selects an input from a connected number of previous sample ticks.",
        "details": [
          "Block type: native-variable-delay.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Selects an input from a connected number of previous sample ticks."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Delay samples",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "u32",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "outputs": [
          {
            "label": "Delayed",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Delay samples\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"u32\"}],\"outputs\":[{\"label\":\"Delayed\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0.1,\"params\":[4],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-variable-delay/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-variable-pulse",
      "namespace": "signal",
      "slug": "signal-block-native-variable-pulse",
      "canonicalSlug": "native-variable-pulse",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Sampled variable pulse generator",
        "label": "Sampled variable pulse generator",
        "summary": "Integrates carrier phase at sample instants with connected period and duty; continuous carrier crossing localization is not supplied.",
        "details": [
          "Block type: native-variable-pulse.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "u[k] → state → y[k]",
          "label": "Sampled variable pulse generator",
          "caption": "Integrates carrier phase at sample instants with connected period and duty; continuous carrier crossing localization is not supplied."
        },
        "inputs": [
          {
            "label": "Period",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Duty ratio",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Pulse",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "bool",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "bool"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Period\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Duty ratio\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Pulse\",\"shape\":[],\"quantity\":\"dimensionless\",\"elementType\":\"bool\"}],\"sampleTimeS\":0.05,\"params\":[0],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-variable-pulse/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-variable-time-delay",
      "namespace": "signal",
      "slug": "signal-block-native-variable-time-delay",
      "canonicalSlug": "native-variable-time-delay",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Variable time delay",
        "label": "Variable time delay",
        "summary": "Reads accepted history at t minus connected delay. Bounds are enforced; discontinuity arrival under changing delay is not root-localized.",
        "details": [
          "Block type: native-variable-time-delay.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Reads accepted history at t minus connected delay. Bounds are enforced; discontinuity arrival under changing delay is not root-localized."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Delay",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Delayed",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Delay\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Delayed\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0.1,1,2048],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-variable-time-delay/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-variable-transport-delay",
      "namespace": "signal",
      "slug": "signal-block-native-variable-transport-delay",
      "canonicalSlug": "native-variable-transport-delay",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Variable transport progress delay",
        "label": "Variable transport progress delay",
        "summary": "Integrates transport progress dξ/dt=1/transit-time and reads history at ξ−1. This differs from a simple time shift.",
        "details": [
          "Block type: native-variable-transport-delay.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Integrates transport progress dξ/dt=1/transit-time and reads history at ξ−1. This differs from a simple time shift."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Transit time",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Transported",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"Transit time\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Transported\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[0.1,1,2048],\"tables\":[[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-variable-transport-delay/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-vector-concatenate",
      "namespace": "signal",
      "slug": "signal-block-native-vector-concatenate",
      "canonicalSlug": "native-vector-concatenate",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Vector concatenate",
        "label": "Vector concatenate",
        "summary": "Joins input arrays in their declared order into one output vector.",
        "details": [
          "Block type: native-vector-concatenate.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Joins input arrays in their declared order into one output vector."
        },
        "inputs": [
          {
            "label": "A",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          },
          {
            "label": "B",
            "shape": [
              2
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 2",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Combined",
            "shape": [
              4
            ],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Array 4",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"A\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"real\"},{\"label\":\"B\",\"shape\":[2],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Combined\",\"shape\":[4],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-vector-concatenate/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-while-iterator-submodel",
      "namespace": "signal",
      "slug": "signal-block-native-while-iterator-submodel",
      "canonicalSlug": "native-while-iterator-submodel",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Bounded while iterator",
        "label": "Bounded while iterator",
        "summary": "Feeds each child result back as its next input, testing the condition before each call. A nonterminating loop stops without committing state.",
        "details": [
          "Block type: native-while-iterator-submodel.",
          "1 declared input and 2 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Bounded while iterator",
          "caption": "Feeds each child result back as its next input, testing the condition before each call. A nonterminating loop stops without committing state."
        },
        "inputs": [
          {
            "label": "Value",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Scaled",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "label": "Invocations this sample",
            "quantity": "dimensionless",
            "shape": [],
            "elementType": "u32",
            "id": "out1",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "u32"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"sampleTimeS\":1,\"params\":[10,0,8,1],\"nested\":{\"type\":\"native-adjustable-gain\",\"outputQuantity\":\"dimensionless\",\"parameters\":{\"config\":{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Scaled\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[2],\"tables\":[]}}},\"tables\":[[1]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-while-iterator-submodel/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-wrap-zero",
      "namespace": "signal",
      "slug": "signal-block-native-wrap-zero",
      "canonicalSlug": "native-wrap-zero",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Reset above threshold",
        "label": "Reset above threshold",
        "summary": "Outputs zero above a threshold and passes values at or below it.",
        "details": [
          "Block type: native-wrap-zero.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Reset above threshold",
          "caption": "Outputs zero above a threshold and passes values at or below it."
        },
        "inputs": [
          {
            "label": "Value",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Value\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[5],\"tables\":[]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-wrap-zero/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "native-zero-pole",
      "namespace": "signal",
      "slug": "signal-block-native-zero-pole",
      "canonicalSlug": "native-zero-pole",
      "existing": true,
      "dynamic": false,
      "scene": {
        "title": "Continuous pole-zero model",
        "label": "Continuous pole-zero model",
        "summary": "Simulates a real-coefficient continuous model defined by poles, zeros and gain.",
        "details": [
          "Block type: native-zero-pole.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → response",
          "label": "Continuous pole-zero model",
          "caption": "Simulates a real-coefficient continuous model defined by poles, zeros and gain."
        },
        "inputs": [
          {
            "label": "Input",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "in0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "label": "Output",
            "shape": [],
            "quantity": "dimensionless",
            "elementType": "real",
            "id": "out0",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "config",
            "label": "Configuration",
            "unit": "",
            "value": "{\"inputs\":[{\"label\":\"Input\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"outputs\":[{\"label\":\"Output\",\"shape\":[],\"quantity\":\"inherit\",\"elementType\":\"real\"}],\"sampleTimeS\":0,\"params\":[2],\"tables\":[[],[-2,0],[0]]}"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-zero-pole/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "outport",
      "namespace": "signal",
      "slug": "signal-block-outport",
      "canonicalSlug": "outport",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Outport",
        "label": "Outport",
        "summary": "A named subsystem output.",
        "details": [
          "Block type: outport.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "→ OUT",
          "label": "Subsystem output boundary",
          "caption": "A named subsystem output."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-outport/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "pi-controller",
      "namespace": "signal",
      "slug": "signal-block-pi-controller",
      "canonicalSlug": "signal-block-pi-controller",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "PI controller",
        "label": "PI controller",
        "summary": "Discrete PI on setpoint minus measurement with output bounds; the integral freezes while the output sits at a bound (anti-windup).",
        "details": [
          "Block type: pi-controller.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "P + ∫ I",
          "label": "Sampled feedback control",
          "caption": "Discrete PI on setpoint minus measurement with output bounds; the integral freezes while the output sits at a bound (anti-windup)."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Setpoint",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "Measurement",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "sampleTimeS",
            "label": "Sample time",
            "unit": "s",
            "value": "0.01"
          },
          {
            "id": "inputQuantity",
            "label": "Setpoint and measurement quantity",
            "unit": "",
            "value": "dimensionless"
          },
          {
            "id": "kp",
            "label": "Proportional gain",
            "unit": "",
            "value": "1"
          },
          {
            "id": "ki",
            "label": "Integral gain",
            "unit": "1/s",
            "value": "0"
          },
          {
            "id": "min",
            "label": "Output minimum",
            "unit": "",
            "value": "-1"
          },
          {
            "id": "max",
            "label": "Output maximum",
            "unit": "",
            "value": "1"
          },
          {
            "id": "initialIntegral",
            "label": "Initial integral",
            "unit": "",
            "value": "0"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "power-law",
      "namespace": "signal",
      "slug": "signal-block-power-law",
      "canonicalSlug": "signal-block-power-law",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Power law",
        "label": "Power law",
        "summary": "gain · sign(x) · |x|^exponent: the odd power law, so fan affinity (f², f³), aerodynamic (v·|v|) and tank blow-down ((m/m₀)ⁿ) terms keep their sign.",
        "details": [
          "Block type: power-law.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Power law",
          "caption": "gain · sign(x) · |x|^exponent: the odd power law, so fan affinity (f², f³), aerodynamic (v·|v|) and tank blow-down ((m/m₀)ⁿ) terms keep their sign."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Input",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "gain",
            "label": "Gain",
            "unit": "",
            "value": "1"
          },
          {
            "id": "exponent",
            "label": "Exponent",
            "unit": "",
            "value": "2"
          },
          {
            "id": "inputQuantity",
            "label": "Input quantity",
            "unit": "",
            "value": "dimensionless"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-power-law/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "product",
      "namespace": "signal",
      "slug": "signal-block-product",
      "canonicalSlug": "signal-block-product",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Product",
        "label": "Product",
        "summary": "Multiplies two typed inputs and an explicit scale.",
        "details": [
          "Block type: product.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "u × v",
          "label": "Multiply the inputs",
          "caption": "Multiplies two typed inputs and an explicit scale."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Left",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "Right",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "scale",
            "label": "Scale",
            "unit": "",
            "value": "1"
          },
          {
            "id": "leftQuantity",
            "label": "Left quantity",
            "unit": "",
            "value": "dimensionless"
          },
          {
            "id": "rightQuantity",
            "label": "Right quantity",
            "unit": "",
            "value": "dimensionless"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "road-load",
      "namespace": "signal",
      "slug": "signal-block-road-load",
      "canonicalSlug": "signal-block-road-load",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Road load",
        "label": "Road load",
        "summary": "Designer vehicle rule: Crr·max(0, N)·sign(v) above a creep threshold + ½ρ·CdA·v·|v| + m·g·sinθ, in newtons.",
        "details": [
          "Block type: road-load.",
          "4 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "physical-model",
          "symbol": "inputs → equation → response",
          "label": "Reduced vehicle equation",
          "caption": "Designer vehicle rule: Crr·max(0, N)·sign(v) above a creep threshold + ½ρ·CdA·v·|v| + m·g·sinθ, in newtons."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Speed",
            "quantity": "linear-speed",
            "unit": "m/s",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Speed",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "Normal force",
            "quantity": "force",
            "unit": "N",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Force",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in2",
            "label": "Mass",
            "quantity": "mass",
            "unit": "kg",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Mass",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in3",
            "label": "Grade sine",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "force",
            "unit": "N",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Force",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "crr",
            "label": "Rolling-resistance coefficient",
            "unit": "",
            "value": "0.01"
          },
          {
            "id": "cdA",
            "label": "Drag area CdA",
            "unit": "m²",
            "value": "0.638"
          },
          {
            "id": "airDensity",
            "label": "Air density",
            "unit": "kg/m³",
            "value": "1.225"
          },
          {
            "id": "rollingThreshold",
            "label": "Rolling-resistance speed threshold",
            "unit": "m/s",
            "value": "0.1"
          },
          {
            "id": "gravity",
            "label": "Gravity",
            "unit": "m/s²",
            "value": "9.80665"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-road-load/",
        "related": [
          {
            "label": "Tyre grip",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-tyre-grip/"
          },
          {
            "label": "Ground contact",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-ground-contact/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "sample-hold",
      "namespace": "signal",
      "slug": "signal-block-sample-hold",
      "canonicalSlug": "signal-block-sample-hold",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Sample and hold",
        "label": "Sample and hold",
        "summary": "Copies its input at every instant of its sample time and holds it in between (zero-order hold).",
        "details": [
          "Block type: sample-hold.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Copies its input at every instant of its sample time and holds it in between (zero-order hold)."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Input",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "sampleTimeS",
            "label": "Sample time",
            "unit": "s",
            "value": "0.01"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "scaled-constant",
      "namespace": "signal",
      "slug": "signal-block-scaled-constant",
      "canonicalSlug": "scaled-constant",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Scaled integer constant",
        "label": "Scaled integer constant",
        "summary": "Encodes exact real-world values as integer codes with an explicit slope and bias.",
        "details": [
          "Block type: scaled-constant.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "command(t)",
          "label": "Declared signal source",
          "caption": "Encodes exact real-world values as integer codes with an explicit slope and bias."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-scaled-constant/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Step",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "scaling-strip",
      "namespace": "signal",
      "slug": "signal-block-scaling-strip",
      "canonicalSlug": "scaling-strip",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Scaling strip",
        "label": "Scaling strip",
        "summary": "Removes scaled-integer metadata and exposes the stored integer codes unchanged.",
        "details": [
          "Block type: scaling-strip.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Removes scaled-integer metadata and exposes the stored integer codes unchanged."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-scaling-strip/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "select",
      "namespace": "signal",
      "slug": "signal-block-select",
      "canonicalSlug": "signal-block-select",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Select",
        "label": "Select",
        "summary": "Passes the first value while the control is at least 0.5 and the second otherwise; both values carry the output quantity.",
        "details": [
          "Block type: select.",
          "3 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Passes the first value while the control is at least 0.5 and the second otherwise; both values carry the output quantity."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Control (0 or 1)",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "When true",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in2",
            "label": "When false",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-select/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "sensor",
      "namespace": "signal",
      "slug": "signal-block-sensor",
      "canonicalSlug": "signal-block-sensor",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Sensor",
        "label": "Sensor",
        "summary": "A sampled reading: seeded Gaussian noise, a quantisation step and a latency in samples — reproducible, not a characterised sensor.",
        "details": [
          "Block type: sensor.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "input → operation → result",
          "label": "Sensor",
          "caption": "A sampled reading: seeded Gaussian noise, a quantisation step and a latency in samples — reproducible, not a characterised sensor."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Measured signal",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "sampleTimeS",
            "label": "Sample time",
            "unit": "s",
            "value": "0.01"
          },
          {
            "id": "noiseStd",
            "label": "Noise standard deviation",
            "unit": "",
            "value": "0"
          },
          {
            "id": "quantizationStep",
            "label": "Quantisation step",
            "unit": "",
            "value": "0"
          },
          {
            "id": "latencySamples",
            "label": "Latency",
            "unit": "samples",
            "value": "0"
          },
          {
            "id": "seed",
            "label": "Noise seed",
            "unit": "",
            "value": "1518465946"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sensor/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Sum",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "signal-copy",
      "namespace": "signal",
      "slug": "signal-block-signal-copy",
      "canonicalSlug": "signal-copy",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Owned signal copy",
        "label": "Owned signal copy",
        "summary": "Materializes a typed signal as an independent native output, including declared bus leaves.",
        "details": [
          "Block type: signal-copy.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Materializes a typed signal as an independent native output, including declared bus leaves."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-signal-copy/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "step",
      "namespace": "signal",
      "slug": "signal-block-step",
      "canonicalSlug": "signal-block-step",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Step source",
        "label": "Step source",
        "summary": "A value that changes once at a known time.",
        "details": [
          "Block type: step.",
          "0 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "source",
          "symbol": "u₀ → u₁",
          "label": "Known-time change",
          "caption": "A value that changes once at a known time."
        },
        "inputs": [],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "before",
            "label": "Before",
            "unit": "",
            "value": "0"
          },
          {
            "id": "after",
            "label": "After",
            "unit": "",
            "value": "1"
          },
          {
            "id": "atS",
            "label": "Change at",
            "unit": "s",
            "value": "1"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-step/",
        "related": [
          {
            "label": "Constant",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-constant/"
          },
          {
            "label": "Pulse",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-pulse/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "subsystem",
      "namespace": "signal",
      "slug": "signal-block-subsystem",
      "canonicalSlug": "subsystem",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Subsystem",
        "label": "Subsystem",
        "summary": "A model with a named versioned input/output interface.",
        "details": [
          "Block type: subsystem.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "hierarchy",
          "symbol": "IN → MODEL → OUT",
          "label": "Named submodel interface",
          "caption": "A model with a named versioned input/output interface."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/",
        "related": [
          {
            "label": "Inport",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-inport/"
          },
          {
            "label": "Outport",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-outport/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "sum",
      "namespace": "signal",
      "slug": "signal-block-sum",
      "canonicalSlug": "signal-block-sum",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Sum",
        "label": "Sum",
        "summary": "Adds signals carrying the same quantity.",
        "details": [
          "Block type: sum.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "math",
          "symbol": "Σ u",
          "label": "Add the inputs",
          "caption": "Adds signals carrying the same quantity."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Input 1",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "Input 2",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "inputs",
            "label": "Inputs",
            "unit": "",
            "value": "2"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/",
        "related": [
          {
            "label": "Gain",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
          },
          {
            "label": "Product",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "thermal-rate",
      "namespace": "signal",
      "slug": "signal-block-thermal-rate",
      "canonicalSlug": "signal-block-thermal-rate",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Thermal balance",
        "label": "Thermal balance",
        "summary": "Lumped heat balance with ambient loss.",
        "details": [
          "Block type: thermal-rate.",
          "3 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "thermal",
          "symbol": "(Q − UA·ΔT) / C",
          "label": "Lumped heat balance",
          "caption": "Lumped heat balance with ambient loss."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Generated heat",
            "quantity": "heat",
            "unit": "W",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Heat flow",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "Temperature",
            "quantity": "temperature",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in2",
            "label": "Ambient",
            "quantity": "temperature",
            "unit": "K",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "temperature-rate",
            "unit": "K/s",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Temperature rate",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "heatCapacityJPerK",
            "label": "Heat capacity",
            "unit": "J/K",
            "value": "900"
          },
          {
            "id": "conductanceWPerK",
            "label": "Ambient conductance",
            "unit": "W/K",
            "value": "1"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-thermal-rate/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "type-duplicate",
      "namespace": "signal",
      "slug": "signal-block-type-duplicate",
      "canonicalSlug": "type-duplicate",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Same-type constraint",
        "label": "Same-type constraint",
        "summary": "Requires two independent signals to have the same numeric type; forwards the first.",
        "details": [
          "Block type: type-duplicate.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Requires two independent signals to have the same numeric type; forwards the first."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-type-duplicate/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "type-inherit",
      "namespace": "signal",
      "slug": "signal-block-type-inherit",
      "canonicalSlug": "type-inherit",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Inherited numeric conversion",
        "label": "Inherited numeric conversion",
        "summary": "Converts a signal to the numeric element type of a connected reference signal.",
        "details": [
          "Block type: type-inherit.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Converts a signal to the numeric element type of a connected reference signal."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-type-inherit/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "type-propagation",
      "namespace": "signal",
      "slug": "signal-block-type-propagation",
      "canonicalSlug": "type-propagation",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Declared type propagation",
        "label": "Declared type propagation",
        "summary": "Resolves an explicitly inherited native output type within this scope before compilation.",
        "details": [
          "Block type: type-propagation.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Resolves an explicitly inherited native output type within this scope before compilation."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-type-propagation/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "tyre-grip",
      "namespace": "signal",
      "slug": "signal-block-tyre-grip",
      "canonicalSlug": "signal-block-tyre-grip",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Tyre grip",
        "label": "Tyre grip",
        "summary": "Friction circle: the requested longitudinal force clamped to ±μ·max(0, N). What the tyre cannot deliver is simply not delivered.",
        "details": [
          "Block type: tyre-grip.",
          "2 declared inputs and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "physical-model",
          "symbol": "inputs → equation → response",
          "label": "Reduced vehicle equation",
          "caption": "Friction circle: the requested longitudinal force clamped to ±μ·max(0, N). What the tyre cannot deliver is simply not delivered."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Requested force",
            "quantity": "force",
            "unit": "N",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Force",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          },
          {
            "id": "in1",
            "label": "Normal force",
            "quantity": "force",
            "unit": "N",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Force",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "force",
            "unit": "N",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Force",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "mu",
            "label": "Friction coefficient μ",
            "unit": "",
            "value": "1"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-tyre-grip/",
        "related": [
          {
            "label": "Road load",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-road-load/"
          },
          {
            "label": "Ground contact",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-ground-contact/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "unit-delay",
      "namespace": "signal",
      "slug": "signal-block-unit-delay",
      "canonicalSlug": "signal-block-unit-delay",
      "existing": false,
      "dynamic": false,
      "scene": {
        "title": "Unit delay",
        "label": "Unit delay",
        "summary": "Publishes the input of the previous instant — the block that breaks a loop between sampled blocks.",
        "details": [
          "Block type: unit-delay.",
          "1 declared input and 1 declared output in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "state",
          "symbol": "input → state → output",
          "label": "State and timing",
          "caption": "Publishes the input of the previous instant — the block that breaks a loop between sampled blocks."
        },
        "inputs": [
          {
            "id": "in0",
            "label": "Input",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "outputs": [
          {
            "id": "out0",
            "label": "Output",
            "quantity": "dimensionless",
            "unit": "—",
            "unitDeclared": true,
            "fields": [],
            "quantityLabel": "Number",
            "shapeLabel": "Scalar",
            "elementLabel": "real"
          }
        ],
        "parameters": [
          {
            "id": "sampleTimeS",
            "label": "Sample time",
            "unit": "s",
            "value": "0.01"
          },
          {
            "id": "initial",
            "label": "Initial output",
            "unit": "",
            "value": "0"
          }
        ],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-unit-delay/",
        "related": [
          {
            "label": "Integrator",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
          },
          {
            "label": "First order",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
          },
          {
            "label": "Sample hold",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "unit-system",
      "namespace": "signal",
      "slug": "signal-block-unit-system",
      "canonicalSlug": "unit-system",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Authored unit policy",
        "label": "Authored unit policy",
        "summary": "Rejects authored unit annotations outside a configured allowed-unit set.",
        "details": [
          "Block type: unit-system.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Rejects authored unit annotations outside a configured allowed-unit set."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-unit-system/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Vector assemble",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "variant-end",
      "namespace": "signal",
      "slug": "signal-block-variant-end",
      "canonicalSlug": "variant-end",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Variant branch end",
        "label": "Variant branch end",
        "summary": "Selects the active input at the end of a compile-time branch region.",
        "details": [
          "Block type: variant-end.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Selects the active input at the end of a compile-time branch region."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-variant-end/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "variant-sink",
      "namespace": "signal",
      "slug": "signal-block-variant-sink",
      "canonicalSlug": "variant-sink",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Variant sink",
        "label": "Variant sink",
        "summary": "Activates one output branch before execution; inactive branch consumers are omitted.",
        "details": [
          "Block type: variant-sink.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Activates one output branch before execution; inactive branch consumers are omitted."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-variant-sink/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "variant-source",
      "namespace": "signal",
      "slug": "signal-block-variant-source",
      "canonicalSlug": "variant-source",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Variant source",
        "label": "Variant source",
        "summary": "Selects an input branch before execution and removes unused inactive producers.",
        "details": [
          "Block type: variant-source.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Selects an input branch before execution and removes unused inactive producers."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-variant-source/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "variant-start",
      "namespace": "signal",
      "slug": "signal-block-variant-start",
      "canonicalSlug": "variant-start",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Variant branch start",
        "label": "Variant branch start",
        "summary": "Starts a statically selected output branch with inactive-branch elimination.",
        "details": [
          "Block type: variant-start.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Starts a statically selected output branch with inactive-branch elimination."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-variant-start/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "variant-subsystem",
      "namespace": "signal",
      "slug": "signal-block-variant-subsystem",
      "canonicalSlug": "variant-subsystem",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Variant submodel",
        "label": "Variant submodel",
        "summary": "Selects one compatible submodel definition before compilation.",
        "details": [
          "Block type: variant-subsystem.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Selects one compatible submodel definition before compilation."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-variant-subsystem/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "vector-assemble",
      "namespace": "signal",
      "slug": "signal-block-vector-assemble",
      "canonicalSlug": "vector-assemble",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Vector assembler",
        "label": "Vector assembler",
        "summary": "Assemble ordered same-quantity scalars.",
        "details": [
          "Block type: vector-assemble.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "routing",
          "symbol": "typed data → typed data",
          "label": "Signal structure and routing",
          "caption": "Assemble ordered same-quantity scalars."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-assemble/",
        "related": [
          {
            "label": "Bus create",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-bus-create/"
          },
          {
            "label": "Subsystem",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-subsystem/"
          }
        ],
        "selected": null,
        "connections": []
      }
    },
    {
      "type": "vector-select",
      "namespace": "signal",
      "slug": "signal-block-vector-select",
      "canonicalSlug": "vector-select",
      "existing": true,
      "dynamic": true,
      "scene": {
        "title": "Vector selector",
        "label": "Vector selector",
        "summary": "Select one scalar by index.",
        "details": [
          "Block type: vector-select.",
          "0 declared inputs and 0 declared outputs in this model.",
          "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
        ],
        "operation": {
          "kind": "control",
          "symbol": "condition → branch",
          "label": "Selection and control",
          "caption": "Select one scalar by index."
        },
        "inputs": [],
        "outputs": [],
        "parameters": [],
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-vector-select/",
        "related": [
          {
            "label": "Compare",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
          },
          {
            "label": "Boolean latch",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
          },
          {
            "label": "Pi controller",
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
          }
        ],
        "selected": null,
        "connections": []
      }
    }
  ]
}
