simple-circuit-engine 0.0.11 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/AGENTS.md +10 -7
  2. package/CLAUDE.md +4 -6
  3. package/README.md +5 -2
  4. package/dist/core/index.d.ts +0 -1
  5. package/dist/core/index.js +74 -2114
  6. package/dist/core/setup.d.ts +17 -0
  7. package/dist/core/simulation/CircuitRunner.d.ts +176 -0
  8. package/dist/core/simulation/DirtyTracker.d.ts +87 -0
  9. package/dist/core/simulation/EventQueue.d.ts +68 -0
  10. package/dist/core/simulation/StateManager.d.ts +100 -0
  11. package/dist/core/simulation/behaviors/BehaviorRegistry.d.ts +70 -0
  12. package/dist/core/simulation/behaviors/ComponentBehavior.d.ts +53 -0
  13. package/dist/core/simulation/behaviors/basic/BatteryBehavior.d.ts +14 -0
  14. package/dist/core/simulation/behaviors/basic/ClockBehavior.d.ts +24 -0
  15. package/dist/core/simulation/behaviors/basic/DoubleThrowSwitchBehavior.d.ts +33 -0
  16. package/dist/core/simulation/behaviors/basic/LightbulbBehavior.d.ts +23 -0
  17. package/dist/core/simulation/behaviors/basic/RectangleLEDBehavior.d.ts +24 -0
  18. package/dist/core/simulation/behaviors/basic/RelayBehavior.d.ts +33 -0
  19. package/dist/core/simulation/behaviors/basic/SmallLEDBehavior.d.ts +24 -0
  20. package/dist/core/simulation/behaviors/basic/SwitchBehavior.d.ts +33 -0
  21. package/dist/core/simulation/behaviors/basic/index.d.ts +20 -0
  22. package/dist/core/simulation/behaviors/gates/InverterBehavior.d.ts +29 -0
  23. package/dist/core/simulation/behaviors/gates/Nand4GateBehavior.d.ts +18 -0
  24. package/dist/core/simulation/behaviors/gates/Nand8GateBehavior.d.ts +18 -0
  25. package/dist/core/simulation/behaviors/gates/NandGateBehavior.d.ts +28 -0
  26. package/dist/core/simulation/behaviors/gates/Nor4GateBehavior.d.ts +18 -0
  27. package/dist/core/simulation/behaviors/gates/Nor8GateBehavior.d.ts +18 -0
  28. package/dist/core/simulation/behaviors/gates/NorGateBehavior.d.ts +22 -0
  29. package/dist/core/simulation/behaviors/gates/Xor4GateBehavior.d.ts +18 -0
  30. package/dist/core/simulation/behaviors/gates/Xor8GateBehavior.d.ts +18 -0
  31. package/dist/core/simulation/behaviors/gates/XorGateBehavior.d.ts +22 -0
  32. package/dist/core/simulation/behaviors/gates/index.d.ts +34 -0
  33. package/dist/core/simulation/behaviors/index.d.ts +24 -0
  34. package/dist/core/simulation/behaviors/types.d.ts +101 -0
  35. package/dist/core/simulation/index.d.ts +18 -0
  36. package/dist/core/simulation/states/ComponentState.d.ts +57 -0
  37. package/dist/core/simulation/states/SimulationState.d.ts +46 -0
  38. package/dist/core/simulation/states/basic/BatteryState.d.ts +16 -0
  39. package/dist/core/simulation/states/basic/ClockState.d.ts +16 -0
  40. package/dist/core/simulation/states/basic/DoubleThrowSwitchState.d.ts +21 -0
  41. package/dist/core/simulation/states/basic/LightbulbState.d.ts +21 -0
  42. package/dist/core/simulation/states/basic/RectangleLEDState.d.ts +9 -0
  43. package/dist/core/simulation/states/basic/RelayState.d.ts +25 -0
  44. package/dist/core/simulation/states/basic/SmallLEDState.d.ts +21 -0
  45. package/dist/core/simulation/states/basic/SwitchState.d.ts +25 -0
  46. package/dist/core/simulation/states/gates/InverterState.d.ts +17 -0
  47. package/dist/core/simulation/states/gates/Nand4GateState.d.ts +10 -0
  48. package/dist/core/simulation/states/gates/Nand8GateState.d.ts +10 -0
  49. package/dist/core/simulation/states/gates/NandGateState.d.ts +16 -0
  50. package/dist/core/simulation/states/gates/Nor4GateState.d.ts +10 -0
  51. package/dist/core/simulation/states/gates/Nor8GateState.d.ts +10 -0
  52. package/dist/core/simulation/states/gates/NorGateState.d.ts +10 -0
  53. package/dist/core/simulation/states/gates/Xor4GateState.d.ts +10 -0
  54. package/dist/core/simulation/states/gates/Xor8GateState.d.ts +10 -0
  55. package/dist/core/simulation/states/gates/XorGateState.d.ts +10 -0
  56. package/dist/core/simulation/states/gates/index.d.ts +25 -0
  57. package/dist/core/simulation/states/index.d.ts +26 -0
  58. package/dist/core/simulation/states/types.d.ts +32 -0
  59. package/dist/core/simulation/types.d.ts +155 -0
  60. package/dist/core/topology/Circuit.d.ts +420 -0
  61. package/dist/core/topology/CircuitMetadata.d.ts +24 -0
  62. package/dist/core/topology/CircuitOptions.d.ts +14 -0
  63. package/dist/core/topology/Component.d.ts +152 -0
  64. package/dist/core/topology/ENode.d.ts +200 -0
  65. package/dist/core/topology/Wire.d.ts +130 -0
  66. package/dist/core/topology/delays.d.ts +52 -0
  67. package/dist/core/topology/index.d.ts +14 -0
  68. package/dist/core/topology/types.d.ts +175 -0
  69. package/dist/core/utils/CameraOptions.d.ts +83 -0
  70. package/dist/core/utils/MemoizeDecorator.d.ts +9 -0
  71. package/dist/core/utils/Position.d.ts +166 -0
  72. package/dist/core/utils/Position3D.d.ts +77 -0
  73. package/dist/core/utils/Rotation.d.ts +82 -0
  74. package/dist/core/utils/index.d.ts +24 -0
  75. package/dist/core/utils/types.d.ts +35 -0
  76. package/dist/core-Bjta9Y7_.js +2707 -0
  77. package/dist/core-Bjta9Y7_.js.map +1 -0
  78. package/dist/index.d.ts +13 -6306
  79. package/dist/index.js +117 -110
  80. package/dist/scene/CircuitEngine.d.ts +270 -0
  81. package/dist/scene/index.d.ts +0 -1
  82. package/dist/scene/index.js +43 -39
  83. package/dist/scene/setup.d.ts +18 -0
  84. package/dist/scene/shared/AbstractCircuitController.d.ts +211 -0
  85. package/dist/scene/shared/BranchingPointVisualFactory.d.ts +70 -0
  86. package/dist/scene/shared/EventEmitter.d.ts +92 -0
  87. package/dist/scene/shared/HoverManager.d.ts +151 -0
  88. package/dist/scene/shared/SelectionManager.d.ts +159 -0
  89. package/dist/scene/shared/WireVisualManager.d.ts +242 -0
  90. package/dist/scene/shared/components/ComponentVisualFactory.d.ts +438 -0
  91. package/dist/scene/shared/components/DefaultVisualFactory.d.ts +51 -0
  92. package/dist/scene/shared/components/FactoryRegistry.d.ts +84 -0
  93. package/dist/scene/shared/components/GroupedFactoryRegistry.d.ts +153 -0
  94. package/dist/scene/shared/components/basic/BatteryVisualFactory.d.ts +13 -0
  95. package/dist/scene/shared/components/basic/ClockVisualFactory.d.ts +79 -0
  96. package/dist/scene/shared/components/basic/DoubleThrowSwitchVisualFactory.d.ts +87 -0
  97. package/dist/scene/shared/components/basic/LabelVisualFactory.d.ts +148 -0
  98. package/dist/scene/shared/components/basic/LightbulbVisualFactory.d.ts +72 -0
  99. package/dist/scene/shared/components/basic/RectangleLEDVisualFactory.d.ts +86 -0
  100. package/dist/scene/shared/components/basic/RelayVisualFactory.d.ts +92 -0
  101. package/dist/scene/shared/components/basic/SmallLEDVisualFactory.d.ts +86 -0
  102. package/dist/scene/shared/components/basic/SwitchVisualFactory.d.ts +85 -0
  103. package/dist/scene/shared/components/gates/InverterVisualFactory.d.ts +104 -0
  104. package/dist/scene/shared/components/gates/Nand4GateVisualFactory.d.ts +27 -0
  105. package/dist/scene/shared/components/gates/Nand8GateVisualFactory.d.ts +27 -0
  106. package/dist/scene/shared/components/gates/NandGateVisualFactory.d.ts +101 -0
  107. package/dist/scene/shared/components/gates/Nor4GateVisualFactory.d.ts +27 -0
  108. package/dist/scene/shared/components/gates/Nor8GateVisualFactory.d.ts +27 -0
  109. package/dist/scene/shared/components/gates/NorGateVisualFactory.d.ts +101 -0
  110. package/dist/scene/shared/components/gates/Xor4GateVisualFactory.d.ts +29 -0
  111. package/dist/scene/shared/components/gates/Xor8GateVisualFactory.d.ts +29 -0
  112. package/dist/scene/shared/components/gates/XorGateVisualFactory.d.ts +103 -0
  113. package/dist/scene/shared/components/index.d.ts +29 -0
  114. package/dist/scene/shared/components/types.d.ts +43 -0
  115. package/dist/scene/shared/types.d.ts +476 -0
  116. package/dist/scene/shared/utils/CameraUtils.d.ts +23 -0
  117. package/dist/scene/shared/utils/ColorUtils.d.ts +26 -0
  118. package/dist/scene/shared/utils/ControlsUtils.d.ts +8 -0
  119. package/dist/scene/shared/utils/GeometryUtils.d.ts +261 -0
  120. package/dist/scene/shared/utils/LayerConstants.d.ts +40 -0
  121. package/dist/scene/shared/utils/LightingUtils.d.ts +31 -0
  122. package/dist/scene/shared/utils/MaterialUtils.d.ts +73 -0
  123. package/dist/scene/shared/utils/Options.d.ts +16 -0
  124. package/dist/scene/simulation/CircuitRunnerController.d.ts +227 -0
  125. package/dist/scene/static/CircuitController.d.ts +227 -0
  126. package/dist/scene/static/CircuitWriter.d.ts +146 -0
  127. package/dist/scene/static/PinTooltipWidget.d.ts +26 -0
  128. package/dist/scene/static/tools/BuildTool.d.ts +286 -0
  129. package/dist/scene/static/tools/ComponentPickerWidget.d.ts +82 -0
  130. package/dist/scene/static/tools/ConfigPanelWidget.d.ts +93 -0
  131. package/dist/scene/static/tools/MultiSelectTool.d.ts +265 -0
  132. package/dist/scene-CVsDdySt.js +7357 -0
  133. package/dist/scene-CVsDdySt.js.map +1 -0
  134. package/package.json +24 -25
  135. package/dist/CircuitRunner-BQQlhwjD.js +0 -1981
  136. package/dist/CircuitRunner-BQQlhwjD.js.map +0 -1
  137. package/dist/core/index.js.map +0 -1
  138. package/dist/index.js.map +0 -1
  139. package/dist/scene/index.js.map +0 -1
  140. package/dist/setup-CIq_kgaw.js +0 -10230
  141. package/dist/setup-CIq_kgaw.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../src/core/utils/MemoizeDecorator.ts","../../src/core/topology/Wire.ts","../../src/core/topology/CircuitOptions.ts","../../src/core/topology/CircuitMetadata.ts","../../src/core/topology/delays.ts","../../src/core/topology/Circuit.ts","../../src/core/simulation/states/ComponentState.ts","../../src/core/simulation/states/basic/BatteryState.ts","../../src/core/simulation/states/basic/LightbulbState.ts","../../src/core/simulation/states/basic/SmallLEDState.ts","../../src/core/simulation/states/basic/RectangleLEDState.ts","../../src/core/simulation/states/basic/RelayState.ts","../../src/core/simulation/states/basic/SwitchState.ts","../../src/core/simulation/states/basic/DoubleThrowSwitchState.ts","../../src/core/simulation/states/gates/index.ts","../../src/core/simulation/states/gates/InverterState.ts","../../src/core/simulation/states/gates/NandGateState.ts","../../src/core/simulation/states/gates/Nand4GateState.ts","../../src/core/simulation/states/gates/Nand8GateState.ts","../../src/core/simulation/states/gates/NorGateState.ts","../../src/core/simulation/states/gates/Nor4GateState.ts","../../src/core/simulation/states/gates/Nor8GateState.ts","../../src/core/simulation/states/gates/XorGateState.ts","../../src/core/simulation/states/gates/Xor4GateState.ts","../../src/core/simulation/states/gates/Xor8GateState.ts","../../src/core/simulation/behaviors/BehaviorRegistry.ts","../../src/core/simulation/behaviors/ComponentBehavior.ts","../../src/core/simulation/behaviors/basic/BatteryBehavior.ts","../../src/core/simulation/behaviors/basic/index.ts","../../src/core/simulation/behaviors/basic/LightbulbBehavior.ts","../../src/core/simulation/behaviors/basic/RectangleLEDBehavior.ts","../../src/core/simulation/behaviors/basic/RelayBehavior.ts","../../src/core/simulation/behaviors/basic/SmallLEDBehavior.ts","../../src/core/simulation/behaviors/basic/SwitchBehavior.ts","../../src/core/simulation/behaviors/basic/DoubleThrowSwitchBehavior.ts","../../src/core/simulation/behaviors/gates/index.ts","../../src/core/simulation/behaviors/gates/InverterBehavior.ts","../../src/core/simulation/behaviors/gates/NandGateBehavior.ts","../../src/core/simulation/behaviors/gates/Nand4GateBehavior.ts","../../src/core/simulation/behaviors/gates/Nand8GateBehavior.ts","../../src/core/simulation/behaviors/gates/NorGateBehavior.ts","../../src/core/simulation/behaviors/gates/Nor4GateBehavior.ts","../../src/core/simulation/behaviors/gates/Nor8GateBehavior.ts","../../src/core/simulation/behaviors/gates/XorGateBehavior.ts","../../src/core/simulation/behaviors/gates/Xor4GateBehavior.ts","../../src/core/simulation/behaviors/gates/Xor8GateBehavior.ts","../../src/core/setup.ts"],"sourcesContent":["interface MemoizeArgs {\n expiring?: number;\n hashFunction?: boolean | ((...args: any[]) => any);\n tags?: string[];\n}\n\nexport function Memoize(args?: MemoizeArgs | MemoizeArgs['hashFunction']) {\n let hashFunction: MemoizeArgs['hashFunction'];\n let duration: MemoizeArgs['expiring'];\n let tags: MemoizeArgs['tags'];\n\n if (typeof args === 'object') {\n hashFunction = args.hashFunction;\n duration = args.expiring;\n tags = args.tags;\n } else {\n hashFunction = args;\n }\n\n return (_target: Object, _propertyKey: string, descriptor: TypedPropertyDescriptor<any>) => {\n if (descriptor.value != null) {\n descriptor.value = getNewFunction(descriptor.value, hashFunction, duration, tags);\n } else if (descriptor.get != null) {\n descriptor.get = getNewFunction(descriptor.get, hashFunction, duration, tags);\n } else {\n throw 'Only put a Memoize() decorator on a method or get accessor.';\n }\n };\n}\n\nexport function MemoizeExpiring(expiring: number, hashFunction?: MemoizeArgs['hashFunction']) {\n // @ts-ignore\n return Memoize({\n expiring,\n hashFunction\n });\n}\n\nconst clearCacheTagsMap: Map<string, Map<any, any>[]> = new Map();\n\nexport function clear (tags: string[]): number {\n const cleared: Set<Map<any, any>> = new Set();\n for (const tag of tags) {\n const maps = clearCacheTagsMap.get(tag);\n if (maps) {\n for (const mp of maps) {\n if (!cleared.has(mp)) {\n mp.clear();\n cleared.add(mp);\n }\n }\n }\n }\n return cleared.size;\n}\n\nfunction getNewFunction(originalMethod: () => void, hashFunction?: MemoizeArgs['hashFunction'], duration: number = 0, tags?: MemoizeArgs['tags']) {\n const propMapName = Symbol(`__memoized_map__`);\n\n // The function returned here gets called instead of originalMethod.\n return function (...args: any[]) {\n let returnedValue: any;\n\n // Get or create map\n // @ts-ignore\n if (!this.hasOwnProperty(propMapName)) {\n // @ts-ignore\n Object.defineProperty(this, propMapName, {\n configurable: false,\n enumerable: false,\n writable: false,\n value: new Map<any, any>()\n });\n }\n // @ts-ignore\n let myMap: Map<any, any> = this[propMapName];\n\n if (Array.isArray(tags)) {\n for (const tag of tags) {\n if (clearCacheTagsMap.has(tag)) {\n // @ts-ignore\n clearCacheTagsMap.get(tag).push(myMap);\n } else {\n clearCacheTagsMap.set(tag, [myMap]);\n }\n }\n }\n\n if (hashFunction || args.length > 0 || duration > 0) {\n let hashKey: any;\n\n // If true is passed as first parameter, will automatically use every argument, passed to string\n if (hashFunction === true) {\n hashKey = args.map(a => a.toString()).join('!');\n } else if (hashFunction) {\n // @ts-ignore\n hashKey = hashFunction.apply(this, args);\n } else {\n hashKey = args[0];\n }\n\n const timestampKey = `${hashKey}__timestamp`;\n let isExpired: boolean = false;\n if (duration > 0) {\n if (!myMap.has(timestampKey)) {\n // \"Expired\" since it was never called before\n isExpired = true;\n } else {\n let timestamp = myMap.get(timestampKey);\n isExpired = (Date.now() - timestamp) > duration;\n }\n }\n\n if (myMap.has(hashKey) && !isExpired) {\n returnedValue = myMap.get(hashKey);\n } else {\n // @ts-ignore\n returnedValue = originalMethod.apply(this, args);\n myMap.set(hashKey, returnedValue);\n if (duration > 0) {\n myMap.set(timestampKey, Date.now());\n }\n }\n\n } else {\n // @ts-ignore\n const hashKey = this;\n if (myMap.has(hashKey)) {\n returnedValue = myMap.get(hashKey);\n } else {\n // @ts-ignore\n returnedValue = originalMethod.apply(this, args);\n myMap.set(hashKey, returnedValue);\n }\n }\n\n return returnedValue;\n };\n}","/**\n * Wire Class\n *\n * Represents electrical connection between exactly two ENodes.\n * Wires can have intermediate positions for custom routing paths.\n *\n * @module core/topology\n */\nimport type {UUID} from \"../utils\";\nimport {generateUUID, Position} from \"../utils\";\nimport type {IWire} from \"./types\";\n\n/**\n * Electrical connection between two ENodes.\n *\n * Wires connect exactly two electrical nodes (component pins or branching points).\n * They support intermediate positions for ad-hoc routing paths in rendering.\n *\n * **Lifecycle**: Wires are created and removed via the Circuit class.\n * - Creating a wire updates bidirectional references (Wire ↔ ENodes)\n * - Removing a wire triggers orphaned branching point cleanup\n * - Splitting a wire creates new branching ENode and multiple wires\n *\n * @example\n * ```typescript\n * const circuit = new Circuit();\n * const comp1 = circuit.addComponent(new Position(0, 0), new Rotation(0), 1);\n * const comp2 = circuit.addComponent(new Position(10, 10), new Rotation(0), 1);\n *\n * // Straight wire\n * const wire = circuit.addWire(comp1.pins[0], comp2.pins[0]);\n *\n * // Wire with custom path\n * const curvedWire = circuit.addWire(\n * comp1.pins[0],\n * comp2.pins[0],\n * [new Position(5, 5), new Position(8, 7)]\n * );\n * ```\n */\nexport class Wire {\n /**\n * Unique identifier for this wire.\n * @readonly\n */\n public readonly id: UUID;\n\n /**\n * First connected ENode UUID.\n * @readonly\n */\n public readonly node1: UUID;\n\n /**\n * Second connected ENode UUID.\n * @readonly\n */\n public readonly node2: UUID;\n\n /**\n * Optional intermediate positions for wire routing.\n * Empty array indicates straight-line connection.\n * @readonly\n */\n public intermediatePositions: Array<Position>;\n\n /**\n * Create a new wire.\n *\n * **Note**: Typically wires are created via `Circuit.addWire()` which\n * handles validation and bidirectional reference updates. This constructor\n * is used internally by Circuit.\n *\n * @param node1 - First ENode UUID\n * @param node2 - Second ENode UUID\n * @param intermediatePositions - Optional waypoints for rendering\n *\n * @example\n * ```typescript\n * // Usually created via Circuit:\n * const wire = circuit.addWire(nodeId1, nodeId2);\n *\n * // With intermediate positions:\n * const wire = circuit.addWire(\n * nodeId1,\n * nodeId2,\n * [new Position(5, 10), new Position(15, 10)]\n * );\n * ```\n */\n constructor(node1: UUID, node2: UUID, intermediatePositions: Array<Position> = []) {\n this.id = generateUUID();\n this.node1 = node1;\n this.node2 = node2;\n this.intermediatePositions = intermediatePositions;\n }\n\n /**\n * Check if this is a straight-line wire.\n *\n * @returns true if no intermediate positions, false otherwise\n *\n * @example\n * ```typescript\n * const straightWire = new Wire(node1, node2);\n * console.log(straightWire.isStraightLine()); // true\n *\n * const curvedWire = new Wire(node1, node2, [new Position(5, 5)]);\n * console.log(curvedWire.isStraightLine()); // false\n * ```\n */\n isStraightLine(): boolean {\n return this.intermediatePositions.length === 0;\n }\n\n /**\n * Serialize wire to JSON.\n *\n * @returns Plain object representation\n *\n * @example\n * ```typescript\n * const json = wire.toJSON();\n * console.log(json);\n * // {\n * // id: \"uuid\",\n * // node1: \"node-uuid-1\",\n * // node2: \"node-uuid-2\",\n * // intermediatePositions: [{ x: 5, y: 10 }]\n * // }\n * ```\n */\n toJSON(): IWire {\n return {\n id: this.id,\n node1: this.node1,\n node2: this.node2,\n intermediatePositions: this.intermediatePositions.map((p) => p.toJSON()),\n };\n }\n\n /**\n * Deserialize wire from JSON.\n *\n * @param json - Wire data\n * @returns Wire instance\n *\n * @example\n * ```typescript\n * const json = {\n * id: \"uuid\",\n * node1: \"node-uuid-1\",\n * node2: \"node-uuid-2\",\n * intermediatePositions: [{ x: 5, y: 10 }]\n * };\n *\n * const wire = Wire.fromJSON(json);\n * ```\n */\n static fromJSON(json: IWire): Wire {\n const positions = json.intermediatePositions.map((p) => Position.fromJSON(p));\n\n const wire = new Wire(json.node1, json.node2, positions);\n\n // Override generated ID with the one from JSON\n Object.defineProperty(wire, 'id', {\n value: json.id,\n writable: false,\n enumerable: true,\n configurable: false,\n });\n\n return wire;\n }\n}\n","/**\n * Circuit Options\n * Encapsulate user writable circuit options\n * @module core/topology\n */\nimport {DEFAULT_LOGIC_FAMILY, type ICircuitOptions, type LogicFamily} from \"./types\";\n\nexport class CircuitOptions implements ICircuitOptions {\n /**\n * Create new circuit options.\n *\n * @param name - Circuit name (default: Untitled Circuit)\n * @param defaultLogicFamily - Circuit default logic family (default: CMOS1)\n */\n constructor(\n public name: string = 'Untitled Circuit',\n public defaultLogicFamily: LogicFamily = DEFAULT_LOGIC_FAMILY\n ) {}\n\n toJSON(): ICircuitOptions {\n return {\n name: this.name,\n defaultLogicFamily: this.defaultLogicFamily,\n };\n }\n\n static fromJSON(json: ICircuitOptions): CircuitOptions {\n return new CircuitOptions(json.name, json.defaultLogicFamily);\n }\n}\n","/**\n * Circuit Metadata\n * Encapsulate user writable circuit options and system managed metadata (camera, size,...)\n * @module core/topology\n */\n\nimport {CameraOptions} from \"../utils\";\nimport {CircuitOptions} from \"./CircuitOptions\";\nimport {\n CIRCUIT_FILE_VERSION,\n DEFAULT_LOGIC_FAMILY,\n type ICircuitMetadata\n} from \"./types\";\n\n\nexport class CircuitMetadata implements ICircuitMetadata {\n /**\n * Create a new CircuitMetadata holding general information about the Circuit.\n *\n * @param version - Circuit version\n * @param options - Circuit options\n * @param size - Size of the circuit grid\n * @param divisions - Divisions in the circuit grid\n * @param cameraOptions - Camera Options at startup\n * @throws {TypeError} If size or divisions are not integers\n */\n constructor(\n public version: string,\n public options: CircuitOptions,\n public size: number,\n public divisions: number,\n public cameraOptions: CameraOptions\n ) {\n if (!Number.isInteger(size) || !Number.isInteger(divisions)) {\n throw new TypeError(\n `Size and divisions must be integers (got size=${size}, divisions=${divisions})`\n );\n }\n }\n\n toJSON(): ICircuitMetadata {\n return {\n version: this.version,\n options: this.options.toJSON(),\n size: this.size,\n divisions: this.divisions,\n cameraOptions: this.cameraOptions.toJSON(),\n };\n }\n\n static fromJSON(json: ICircuitMetadata): CircuitMetadata {\n if (CIRCUIT_FILE_VERSION !== json.version) {\n console.warn(`This version of the engine supports v${CIRCUIT_FILE_VERSION} circuit version files. \n Unexpected behavior may occurs loading v${json.version}.`);\n }\n\n const options = json.options\n ? CircuitOptions.fromJSON(json.options)\n : new CircuitOptions('Untitled Circuit', DEFAULT_LOGIC_FAMILY);\n return new CircuitMetadata(\n json.version,\n options,\n json.size,\n json.divisions,\n CameraOptions.fromJSON(json.cameraOptions)\n );\n }\n\n toString(): string {\n return `CircuitMetadata(${this.version}, ${this.options.name}, ${this.options.defaultLogicFamily}, ${this.size}, ${this.divisions}, ${this.cameraOptions.toString()})`;\n }\n}","/**\n * Logic Family Types and Delay Computation\n *\n * Provides the logic family model for gate components, mapping technology\n * choices (CMOS, TTL) to propagation delays derived from physical principles.\n *\n * @module core/topology\n */\n\nimport {ComponentType, type LogicFamily} from \"./types\";\nimport {Component} from \"./Component\";\n\n// TTL1 delay lookup tables indexed by input count\n// Physical basis: multi-emitter BJTs mean NAND4 is still single-stage; NOR is disadvantaged\nconst TTL1_NAND: Record<number, number> = { 2: 1, 4: 1, 8: 2, 16: 2 };\nconst TTL1_AND: Record<number, number> = { 2: 2, 4: 2, 8: 3, 16: 3 };\nconst TTL1_NOR: Record<number, number> = { 2: 1, 4: 2, 8: 2, 16: 3 };\nconst TTL1_OR: Record<number, number> = { 2: 2, 4: 3, 8: 3, 16: 4 };\n\n/**\n * Gate family classification used for delay table lookup.\n * Maps to the logical function regardless of physical implementation.\n */\ntype GateFamily = 'NOT' | 'Buffer' | 'NAND' | 'AND' | 'NOR' | 'OR' | 'XOR' | 'XNOR';\n\n/**\n * Given a component compute the basis transitionSpan from its logicFamily if applicable\n * if not applicable / already implemented returns undefined\n * @param component\n */\nexport function computeTransitionSpan(\n component: Component,\n): number | undefined {\n const logicFamily = component.config.get('defaultLogicFamily') as LogicFamily | undefined;\n if (!logicFamily || logicFamily === 'Sandbox') {\n return undefined;\n }\n\n if(isLogicGate(component.type)) {\n const activationLogic = component.config.get('activationLogic') ?? 'negative';\n const classif = classifyGate(component.type, activationLogic);\n if(!classif) return undefined;\n const delay = computeGateDelay(logicFamily, classif.gateFamily, classif.inputCount);\n return delay || undefined;\n }\n\n // other component families will be to implement as they come\n return undefined;\n}\n\nfunction isLogicGate(type: ComponentType): boolean {\n return [\n ComponentType.Inverter,\n ComponentType.NandGate,\n ComponentType.Nand4Gate,\n ComponentType.Nand8Gate,\n ComponentType.NorGate,\n ComponentType.Nor4Gate,\n ComponentType.Nor8Gate,\n ComponentType.XorGate,\n ComponentType.Xor4Gate,\n ComponentType.Xor8Gate\n ].includes(type);\n}\n\n/**\n * Classify a ComponentType + activationLogic combination into a GateFamily and input count.\n *\n * Returns null for non-gate component types (Battery, Switch, LED, etc.).\n *\n * @param componentType - The component type to classify\n * @param activationLogic - 'positive' or 'negative' from the component config\n * @returns Object with gateFamily and inputCount, or null if not a gate\n */\nexport function classifyGate(componentType: ComponentType, activationLogic: string):\n {gateFamily: GateFamily, inputCount: number} | null {\n switch (componentType) {\n case ComponentType.Inverter:\n return { gateFamily: activationLogic === 'negative' ? 'NOT' : 'Buffer', inputCount: 1 };\n case ComponentType.NandGate:\n return { gateFamily: activationLogic === 'negative' ? 'NAND' : 'AND', inputCount: 2 };\n case ComponentType.Nand4Gate:\n return { gateFamily: activationLogic === 'negative' ? 'NAND' : 'AND', inputCount: 4 };\n case ComponentType.Nand8Gate:\n return { gateFamily: activationLogic === 'negative' ? 'NAND' : 'AND', inputCount: 8 };\n case ComponentType.NorGate:\n return { gateFamily: activationLogic === 'negative' ? 'NOR' : 'OR', inputCount: 2 };\n case ComponentType.Nor4Gate:\n return { gateFamily: activationLogic === 'negative' ? 'NOR' : 'OR', inputCount: 4 };\n case ComponentType.Nor8Gate:\n return { gateFamily: activationLogic === 'negative' ? 'NOR' : 'OR', inputCount: 8 };\n case ComponentType.XorGate:\n return { gateFamily: activationLogic === 'negative' ? 'XNOR' : 'XOR', inputCount: 2 };\n case ComponentType.Xor4Gate:\n return { gateFamily: activationLogic === 'negative' ? 'XNOR' : 'XOR', inputCount: 4 };\n case ComponentType.Xor8Gate:\n return { gateFamily: activationLogic === 'negative' ? 'XNOR' : 'XOR', inputCount: 8 };\n default:\n return null;\n }\n}\n\n/**\n * Compute the propagation delay in ticks for a gate given its logic family, gate family, and input count.\n *\n * CMOS1 formulas (base unit: 1 inverter = 1 tick):\n * - NOT: 1 (constant)\n * - Buffer: 2 (constant)\n * - NAND/NOR: log2(n)\n * - AND/OR: log2(n) + 1\n * - XOR: log2(n) * 2\n * - XNOR: log2(n) * 2 + 1\n *\n * This table assumes inverter, NAND, NAND4, NAND8, NOR, NOR4, NOR8 and XOR(2) are transistor level primitives\n *\n * TTL1 uses lookup tables (base unit: NAND2 = 1 tick).\n * NOT and Buffer: same as CMOS1 (1 and 2 ticks).\n * XOR/XNOR: same as CMOS1.\n *\n * @param logicFamily - The technology family\n * @param gateFamily - The logical gate function\n * @param inputCount - Number of data inputs (not counting Vcc)\n * @returns Propagation delay in ticks (integer >= 1)\n * @throws {Error} If called with Sandbox family (caller must not invoke for Sandbox)\n * @throws {Error} If input count is unsupported for the given family\n */\nexport function computeGateDelay(\n logicFamily: LogicFamily,\n gateFamily: GateFamily,\n inputCount: number\n): number {\n if (logicFamily === 'Sandbox') {\n throw new Error('computeGateDelay must not be called for Sandbox family');\n }\n\n // NOT and Buffer are constant across both CMOS1 and TTL1\n if (gateFamily === 'NOT') return 1;\n if (gateFamily === 'Buffer') return 2;\n\n // XOR and XNOR are the same across CMOS1 and TTL1\n if (gateFamily === 'XOR') return Math.log2(inputCount) * 2;\n if (gateFamily === 'XNOR') return Math.log2(inputCount) * 2 + 1;\n\n if (logicFamily === 'CMOS1') {\n const log2n = Math.log2(inputCount);\n switch (gateFamily) {\n case 'NAND':\n return log2n;\n case 'NOR':\n return log2n;\n case 'AND':\n return log2n + 1;\n case 'OR':\n return log2n + 1;\n }\n }\n\n if (logicFamily === 'TTL1') {\n let table: Record<number, number>;\n switch (gateFamily) {\n case 'NAND':\n table = TTL1_NAND;\n break;\n case 'AND':\n table = TTL1_AND;\n break;\n case 'NOR':\n table = TTL1_NOR;\n break;\n case 'OR':\n table = TTL1_OR;\n break;\n }\n const delay = table![inputCount];\n if (delay === undefined) {\n throw new Error(`Unsupported input count ${inputCount} for TTL1 ${gateFamily}`);\n }\n return delay;\n }\n\n // Should be unreachable\n throw new Error(`Unsupported logic family: ${logicFamily}`);\n}\n","/**\n * Circuit Class\n *\n * Core Topology object encapsulating and binding all electrical/logical topology elements together\n * Provides the primary API for creating and manipulating topology data\n *\n * @module core/topology\n */\n\nimport {\n type UUID,\n Rotation,\n CameraOptions,\n Position,\n findPositionBestIndex,\n simplifyPositions,\n} from '../utils';\nimport {\n CIRCUIT_FILE_VERSION,\n COMPONENT_TYPE_METADATA,\n ComponentType,\n ENodeSourceType, ENodeType,\n type ICircuit, type IComponent, type IENode, type IWire\n} from \"./types\";\nimport {CircuitOptions} from './CircuitOptions';\nimport {CircuitMetadata} from \"./CircuitMetadata\";\nimport {Component} from './Component';\nimport {ENode} from './ENode';\nimport {Wire} from './Wire';\nimport {computeTransitionSpan,} from './delays';\n\n/**\n * Circuit container managing components, ENodes, and wires.\n *\n * The Circuit class provides:\n * - Component management (add/remove with automatic pin ENode creation)\n * - Topology queries (get by ID, enumerate all)\n * - Automatic lifecycle management (cascade deletion, orphan cleanup)\n * - JSON serialization for persistence\n *\n * **Key Principles**:\n * - Users manage Components and Wires; ENodes are managed automatically\n * - Removing a Component cascades to remove its pins and connected wires\n * - Orphaned branching ENodes (no wires) are automatically removed\n * - All operations maintain bidirectional consistency\n *\n * @example\n * ```typescript\n * const circuit = new Circuit();\n *\n * // Add a component at position (10, 20) with 2 pins\n * const lightbulb = circuit.addComponent(\n * new Position(10, 20),\n * new Rotation(90),\n * 2\n * );\n *\n * console.log(lightbulb.id); // UUID\n * console.log(lightbulb.pins); // [pin-uuid-1, pin-uuid-2]\n *\n * // Query components\n * const comp = circuit.getComponent(lightbulb.id);\n * const all = circuit.getAllComponents();\n *\n * // Remove component (cascade deletes pins and wires)\n * circuit.removeComponent(lightbulb.id);\n * ```\n */\nexport class Circuit {\n /**\n * Circuit metadata holding general information.\n * @private\n */\n public metadata: CircuitMetadata;\n\n /**\n * Map of all components in the circuit (UUID → Component).\n * @private\n */\n private components: Map<UUID, Component>;\n\n /**\n * Map of all electrical nodes in the circuit (UUID → ENode).\n * Includes both pin nodes and branching point nodes.\n * @private\n */\n private enodes: Map<UUID, ENode>;\n\n /**\n * Map of all wires in the circuit (UUID → Wire).\n * @private\n */\n private wires: Map<UUID, Wire>;\n\n /**\n * Create a new empty circuit.\n */\n constructor(options: CircuitOptions) {\n this.metadata = new CircuitMetadata(CIRCUIT_FILE_VERSION, options, 10, 10, new CameraOptions());\n\n this.components = new Map();\n this.enodes = new Map();\n this.wires = new Map();\n }\n\n get name(): string {\n return this.metadata.options.name;\n }\n\n set name(value: string) {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new TypeError('Circuit name must be a non-empty string');\n }\n this.metadata.options.name = value;\n }\n\n /**\n * Add a new component to the circuit.\n *\n * Automatically creates pin ENodes for the component and links them\n * bidirectionally. Pin ENode UUIDs are stored in the component's pins array.\n * Pin labels are derived from the ComponentType metadata.\n *\n * @param type - Component type (Battery, Switch, LED, etc.)\n * @param position - Grid position (x, y integers)\n * @param rotation - Orientation angle (integer degrees)\n * @param config - Optional configuration map for component-specific settings\n * @returns The created Component\n * @throws {TypeError} If position/rotation coordinates are not integers\n *\n * @example\n * ```typescript\n * const lightbulb = circuit.addComponent(\n * new Position(10, 20),\n * new Rotation(90),\n * ComponentType.Lightbulb\n * );\n *\n * console.log(lightbulb.type); // ComponentType.Lightbulb\n * console.log(lightbulb.pins.length); // 2\n * console.log(lightbulb.position.x); // 10\n * ```\n */\n addComponent(\n type: ComponentType,\n position: Position,\n rotation: Rotation,\n config?: Map<string, string> | undefined\n ): Component {\n // Get component type metadata\n const metadata = COMPONENT_TYPE_METADATA[type]\n\n // Create component first (to get its ID)\n const component = new Component(type, position, rotation, []);\n if (config) {\n for (const [key, value] of config) {\n component.config.set(key, value);\n }\n }\n\n // If component has defaultLogicFamily config and it is empty, inherit from grid default\n if (component.config.has('defaultLogicFamily') && !component.config.get('defaultLogicFamily')) {\n component.config.set('defaultLogicFamily', this.metadata.options.defaultLogicFamily);\n }\n\n // Resolve transitionSpan from logic family and gate classification\n this.resolveTransitionSpan(component);\n\n // Create pin ENodes for the component using metadata pin labels\n const pins: UUID[] = [];\n for (const [pinLabel, pinMeta] of metadata.pins) {\n const pinNode = new ENode(\n ENodeType.Pin,\n component.id,\n pinLabel,\n undefined, // Pin position derived from component\n pinMeta.sourceType,\n pinMeta.subtype\n );\n\n // Add ENode to circuit\n this.enodes.set(pinNode.id, pinNode);\n\n // Store pin ID\n pins.push(pinNode.id);\n }\n\n // Update component with pin IDs using Object.defineProperty\n // (Component.pins is readonly, but we're in the trusted Circuit context)\n Object.defineProperty(component, 'pins', {\n value: pins,\n writable: false,\n enumerable: true,\n configurable: false,\n });\n\n // Add component to circuit\n this.components.set(component.id, component);\n\n return component;\n }\n\n /**\n * Resolve and update the transitionSpan config for a component\n * if automatic resolution returns undefined nothing is done on the component\n *\n * @param component - Component to resolve transitionSpan for\n */\n resolveTransitionSpan(component: Component): void {\n if(!component.config.has('transitionSpan')) {\n return;\n }\n const delay = computeTransitionSpan(component);\n if(!!delay){\n component.config.set('transitionSpan', String(delay));\n }\n }\n\n /**\n * Remove a component from the circuit.\n *\n * **Cascade deletion** removes:\n * - All pin ENodes belonging to the component\n * - All Wires connected to those pins\n *\n * @param id - Component UUID\n * @throws {Error} If component does not exist\n * @returns Object containing arrays of deleted Wires and ENodes IDs\n *\n * @example\n * ```typescript\n * circuit.removeComponent(componentId);\n * // Component, its pins, and connected wires are all removed\n * ```\n */\n removeComponent(id: UUID): {\n deletedWires: UUID[];\n deletedENodes: UUID[];\n } {\n const component = this.components.get(id);\n\n if (!component) {\n throw new Error(`Component ${id} does not exist`);\n }\n\n const deletedWires: UUID[] = [];\n const deletedENodes: UUID[] = [];\n\n // Remove all wires connected to this component's pins\n for (const pinId of component.pins) {\n const enode = this.enodes.get(pinId);\n if (enode) {\n // Remove all wires connected to this pin\n const wireIds = Array.from(enode.wires);\n for (const wireId of wireIds) {\n this.removeWire(wireId);\n deletedWires.push(wireId);\n }\n }\n // Remove the pin ENode\n this.enodes.delete(pinId);\n deletedENodes.push(pinId);\n }\n\n // Remove component from map\n this.components.delete(id);\n return { deletedWires, deletedENodes };\n }\n\n hasComponent(id: UUID): boolean {\n return this.components.has(id);\n }\n\n /**\n * Get a component by ID.\n *\n * @param id - Component UUID\n * @returns The Component or undefined if not found\n *\n * @example\n * ```typescript\n * const component = circuit.getComponent(componentId);\n * if (component) {\n * console.log(component.position);\n * }\n * ```\n */\n getComponent(id: UUID): Component | undefined {\n return this.components.get(id);\n }\n\n /**\n * Get all components in the circuit.\n *\n * Returns a new array on each call (defensive copy).\n *\n * @returns Array of all Components\n *\n * @example\n * ```typescript\n * const components = circuit.getAllComponents();\n * console.log(`Circuit has ${components.length} components`);\n *\n * for (const comp of components) {\n * console.log(comp.id, comp.position);\n * }\n * ```\n */\n getAllComponents(): Component[] {\n return Array.from(this.components.values());\n }\n\n getAllComponentsByType(type: ComponentType): Component[] {\n const result: Component[] = [];\n for (const component of this.components.values()) {\n if (component.type === type) {\n result.push(component);\n }\n }\n return result;\n }\n\n getFirstComponentOfType(type: ComponentType): Component | undefined {\n for (const component of this.components.values()) {\n if (component.type === type) {\n return component;\n }\n }\n return undefined;\n }\n\n /**\n * Get an electrical node by ID.\n *\n * Note: ENodes are automatically managed and not directly created\n * or removed by users.\n *\n * @param id - ENode UUID\n * @returns The ENode or undefined if not found\n *\n * @example\n * ```typescript\n * const component = circuit.addComponent(\n * new Position(10, 20),\n * new Rotation(0),\n * 2\n * );\n *\n * const pinId = component.pins[0];\n * const enode = circuit.getENode(pinId);\n * console.log(enode.type); // ENodeType.Pin\n * ```\n */\n getENode(id: UUID): ENode | undefined {\n return this.enodes.get(id);\n }\n\n /**\n * Get all electrical nodes in the circuit.\n *\n * Includes both pin nodes (from components) and branching point nodes\n * (from wire splits).\n *\n * Returns a new array on each call (defensive copy).\n *\n * @returns Array of all ENodes\n *\n * @example\n * ```typescript\n * const enodes = circuit.getAllENodes();\n * console.log(`Circuit has ${enodes.length} electrical nodes`);\n *\n * for (const enode of enodes) {\n * console.log(enode.id, enode.type);\n * }\n * ```\n */\n getAllENodes(): ENode[] {\n return Array.from(this.enodes.values());\n }\n\n /**\n * Add a branching point electrical node at a specific position.\n *\n * Branching points are used to split wires and create junctions.\n * @param position - Grid position for the branching point\n * @param sourceType - Optional source type (voltage/current)\n * @returns The created ENode\n */\n addBranchingPoint(position: Position, sourceType?: ENodeSourceType): ENode {\n const branchingPoint = new ENode(\n ENodeType.BranchingPoint,\n undefined,\n undefined,\n position,\n sourceType\n );\n\n // Add ENode to circuit\n this.enodes.set(branchingPoint.id, branchingPoint);\n\n return branchingPoint;\n }\n\n /**\n * Remove a branching point electrical node from the circuit.\n * Also removes all wires connected to this branching point if there are ony one or more than 2.\n * In the case there are exactly two wires, they will be merged before removing the branching point.\n *\n * @param id - Branching point ENode UUID\n * @throws {Error} If ENode does not exist or is not a branching point\n */\n removeBranchingPoint(id: UUID): {\n deletedWires?: UUID[] | undefined;\n mergedWires?: UUID[] | undefined;\n newWire?: Wire | undefined;\n } {\n const enode = this.enodes.get(id);\n\n if (!enode) {\n throw new Error(`Enode ${id} does not exist`);\n }\n if (enode.type !== ENodeType.BranchingPoint) {\n throw new Error(\n `Enode ${id} is not a branching point, it must be removed with its component.`\n );\n }\n\n const result = {};\n\n // Remove all wires connected to this branching point\n const wires = this.getWiresByNode(id);\n\n if (wires.length === 1 || wires.length > 2) {\n const deletedWires: UUID[] = [];\n for (const wire of wires) {\n this.removeWire(wire.id);\n deletedWires.push(wire.id);\n }\n Object.assign(result, { deletedWires });\n } else if (wires.length === 2) {\n // Merge the two wires into one\n const wire1 = wires[0]!;\n const wire2 = wires[1]!;\n\n // Determine the two nodes to connect\n const otherNode1 = wire1.node1 === id ? wire1.node2 : wire1.node1;\n const otherNode2 = wire2.node1 === id ? wire2.node2 : wire2.node1;\n\n // compute intermediate positions for the new wire\n const intermediatePositions: Position[] = [];\n if (otherNode1 === wire1.node1) {\n intermediatePositions.push(...wire1.intermediatePositions);\n } else if (otherNode1 === wire1.node2) {\n intermediatePositions.push(...[...wire1.intermediatePositions].reverse());\n }\n intermediatePositions.push(enode.getPosition(this));\n if (otherNode2 === wire2.node1) {\n intermediatePositions.push(...[...wire2.intermediatePositions].reverse());\n } else if (otherNode2 === wire2.node2) {\n intermediatePositions.push(...wire2.intermediatePositions);\n }\n\n // Remove the old wires\n this.removeWire(wire1.id);\n this.removeWire(wire2.id);\n\n // Create new wire connecting the two other nodes\n const newWire = this.addWire(otherNode1, otherNode2, intermediatePositions);\n if (newWire instanceof Error) {\n throw new Error(`Failed to merge wires at branching point ${id}: ${newWire.message}`);\n }\n Object.assign(result, { mergedWires: [wire1.id, wire2.id] });\n Object.assign(result, { newWire: newWire });\n }\n\n // Remove the branching point ENode\n this.enodes.delete(id);\n return result;\n }\n\n /**\n * Add a wire connecting two electrical nodes.\n *\n * Validates that both nodes exist, not a self-connection, and no duplicate.\n * Updates bidirectional references (Wire ↔ ENodes).\n *\n * @param node1 - First ENode UUID\n * @param node2 - Second ENode UUID\n * @param intermediatePositions - Optional path waypoints for rendering\n * @returns The created Wire, or Error if validation fails\n *\n * @example\n * ```typescript\n * const comp1 = circuit.addComponent(new Position(0, 0), new Rotation(0), 1);\n * const comp2 = circuit.addComponent(new Position(10, 10), new Rotation(0), 1);\n *\n * const wire = circuit.addWire(comp1.pins[0], comp2.pins[0]);\n * if (wire instanceof Error) {\n * console.error('Failed:', wire.message);\n * }\n * ```\n */\n addWire(node1: UUID, node2: UUID, intermediatePositions?: Position[]): Wire | Error {\n // Validate self-connection\n if (node1 === node2) {\n return new Error('Cannot create wire connecting node to itself');\n }\n\n // Validate both nodes exist\n const enode1 = this.enodes.get(node1);\n const enode2 = this.enodes.get(node2);\n\n if (!enode1 || !enode2) {\n return new Error('Wire requires at least one existing ENode');\n }\n\n // Check for duplicate wire\n if (this.hasWireBetween(node1, node2)) {\n return new Error('Duplicate wire between same nodes');\n }\n\n // Create wire\n const wire = new Wire(node1, node2, intermediatePositions || []);\n\n // Add wire to circuit\n this.wires.set(wire.id, wire);\n\n // Update bidirectional references: ENode → Wire\n enode1.wires.add(wire.id);\n enode2.wires.add(wire.id);\n\n return wire;\n }\n\n /**\n * Remove a wire from the circuit.\n *\n * @param id - Wire UUID\n * @throws {Error} If wire does not exist\n *\n * @example\n * ```typescript\n * circuit.removeWire(wireId);\n * // Wire is removed\n * ```\n */\n removeWire(id: UUID): void {\n const wire = this.wires.get(id);\n\n if (!wire) {\n throw new Error(`Wire ${id} does not exist`);\n }\n\n // Get connected nodes\n const enode1 = this.enodes.get(wire.node1);\n const enode2 = this.enodes.get(wire.node2);\n\n // Remove wire from nodes' wire sets\n if (enode1) {\n enode1.wires.delete(id);\n }\n if (enode2) {\n enode2.wires.delete(id);\n }\n\n // Remove wire from circuit\n this.wires.delete(id);\n }\n\n /**\n * Split a wire in the circuit.\n *\n * It creates two new wires connected by either the target enode or a new branching point ENode at the specified position.\n * Returns 2 UUIDS of the new wires.\n *\n * @param id - Wire UUID\n * @param position\n * @throws {Error} If wire does not exist\n *\n * @example\n * ```typescript\n * circuit.splitWire(wireId);\n * // Wire and any orphaned branching points are removed\n * ```\n */\n /**\n * Split an existing wire at a position, creating a branching point.\n * The original wire is removed and replaced with two new wires\n * connecting through the new branching point.\n * NB : in the special case where targetEnode belongs to a component where the wire is already connected\n * only one new wire will be created as this method don't allow a wire directly connecting two pins of the same component.\n *\n * @param wireId - Wire to split\n * @param position - Position for the new branching point : no effect if targetEnodeId provided\n * @param targetEnodeId - if provided, the existing enode to split the wire at\n * @returns Object containing the new branching point and an array of the two new wires\n * @throws Error if wireId not found\n */\n splitWire(\n wireId: UUID,\n position: Position,\n targetEnodeId: UUID | null = null\n ): {\n branchingPoint: ENode;\n wires: Array<Wire>;\n } {\n const wire = this.wires.get(wireId);\n\n if (!wire) {\n throw new Error(`Wire ${wireId} does not exist`);\n }\n\n // Get connected nodes\n const enode1 = this.enodes.get(wire.node1);\n const enode2 = this.enodes.get(wire.node2);\n\n if (!enode1 || !enode2) {\n throw new Error(`Wire ${wireId} is connected to non-existent ENodes`);\n }\n\n // computing best intermediate positions for the two new wires\n const fullPositions = [\n enode1.getPosition(this),\n ...wire.intermediatePositions,\n enode2.getPosition(this),\n ];\n const index = findPositionBestIndex(fullPositions, position);\n const positionsWire1 = fullPositions.slice(1, index);\n const positionsWire2 = fullPositions.slice(index, fullPositions.length - 1);\n\n // deleting and dereferencing the old wire\n this.wires.delete(wireId);\n enode1.wires.delete(wireId);\n enode2.wires.delete(wireId);\n\n let eNode: ENode;\n if (targetEnodeId) {\n if (!this.enodes.get(targetEnodeId)) {\n throw new Error(`Target ENode ${targetEnodeId} does not exist`);\n } else {\n eNode = this.enodes.get(targetEnodeId)!;\n }\n } else {\n // Create new branching point ENode at specified position\n eNode = this.addBranchingPoint(position);\n }\n\n const newWires = [];\n\n if (\n (!eNode.component || enode1.component !== eNode.component) &&\n !this.hasWireBetween(enode1.id, eNode.id)\n ) {\n const result = this.addWire(enode1.id, eNode.id, positionsWire1);\n if (result instanceof Wire) {\n this.simplifyWireIntermediatePositions(result.id);\n newWires.push(result);\n } else {\n console.warn(`Failure to create wire at split : ${result.message}`);\n }\n }\n if (\n (!eNode.component || enode2.component !== eNode.component) &&\n !this.hasWireBetween(enode2.id, eNode.id)\n ) {\n const result = this.addWire(eNode.id, enode2.id, positionsWire2);\n if (result instanceof Wire) {\n this.simplifyWireIntermediatePositions(result.id);\n newWires.push(result);\n } else {\n console.warn(`Failure to create wire at split : ${result.message}`);\n }\n }\n\n return {\n branchingPoint: eNode,\n wires: newWires,\n };\n }\n\n getWireBetweenNodes(node1: UUID, node2: UUID): Wire | undefined {\n const enode1 = this.enodes.get(node1);\n if (!enode1) {\n return undefined;\n }\n // Check if any wire from node1 connects to node2\n for (const wireId of enode1.wires) {\n const wire = this.wires.get(wireId);\n if (wire && (wire.node2 === node2 || wire.node1 === node2)) {\n return wire;\n }\n }\n return undefined;\n }\n\n /**\n * Get a wire by ID.\n *\n * @param id - Wire UUID\n * @returns The Wire or undefined if not found\n */\n getWire(id: UUID): Wire | undefined {\n return this.wires.get(id);\n }\n\n /**\n * Get all wires in the circuit.\n *\n * Returns a new array on each call (defensive copy).\n *\n * @returns Array of all Wires\n */\n getAllWires(): Wire[] {\n return Array.from(this.wires.values());\n }\n\n /**\n * Get all wires connected to a specific ENode.\n *\n * @param nodeId - ENode UUID\n * @returns Array of connected Wires, or empty array if node not found\n */\n getWiresByNode(nodeId: UUID): Wire[] {\n const enode = this.enodes.get(nodeId);\n if (!enode) {\n return [];\n }\n\n const wires: Wire[] = [];\n for (const wireId of enode.wires) {\n const wire = this.wires.get(wireId);\n if (wire) {\n wires.push(wire);\n }\n }\n\n return wires;\n }\n\n /**\n * Get all wires connected to a component, e.g to any pin enode of the component.\n *\n * @param componentId - Component UUID\n * @returns Array of connected Wires, or empty array if component not found\n */\n getWiresByComponent(componentId: UUID): Wire[] {\n const component = this.components.get(componentId);\n if (!component) {\n return [];\n }\n const wires: Wire[] = [];\n\n for (const pinId of component.pins) {\n wires.push(...this.getWiresByNode(pinId));\n }\n\n return wires;\n }\n\n /**\n * Get both ENodes connected by a wire.\n *\n * @param wireId - Wire UUID\n * @returns Tuple [node1, node2] or undefined if wire not found\n */\n getNodesByWire(wireId: UUID): [ENode, ENode] | undefined {\n const wire = this.wires.get(wireId);\n if (!wire) {\n return undefined;\n }\n\n const node1 = this.enodes.get(wire.node1);\n const node2 = this.enodes.get(wire.node2);\n\n if (!node1 || !node2) {\n return undefined;\n }\n\n return [node1, node2];\n }\n\n /**\n * Check if a wire already exists between two nodes.\n *\n * Order-independent: returns true for (A, B) or (B, A).\n *\n * @param node1 - First ENode UUID\n * @param node2 - Second ENode UUID\n * @returns true if wire exists, false otherwise\n */\n hasWireBetween(node1: UUID, node2: UUID): boolean {\n const enode1 = this.enodes.get(node1);\n if (!enode1) {\n return false;\n }\n\n // Check if any wire from node1 connects to node2\n for (const wireId of enode1.wires) {\n const wire = this.wires.get(wireId);\n if (wire && (wire.node2 === node2 || wire.node1 === node2)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Find all components with pins among the provided enode IDs set.\n *\n * @param pinIds - Set of pins UUIDs\n * @returns Set of components UUIDs\n */\n getComponentsOfPins(pinIds: Set<UUID>): Set<UUID> {\n const componentIds = new Set<UUID>();\n\n for (const enodeId of pinIds) {\n const enode = this.enodes.get(enodeId);\n if (!!enode?.component) {\n componentIds.add(enode.component);\n }\n }\n return componentIds;\n }\n\n /**\n * Get a component's pin ENode by its label.\n * @param component\n * @param pinLabel\n */\n getComponentPinByLabel(component: Component, pinLabel: string): ENode | undefined {\n let pinIndex = 0;\n const typeMetadata = COMPONENT_TYPE_METADATA[component.type];\n const pinLabels = Array.from(typeMetadata.pins.keys());\n for (const pinId of component.pins) {\n const enode = this.enodes.get(pinId);\n const label = pinLabels[pinIndex];\n if (!label) continue;\n if (enode && label === pinLabel) {\n return enode;\n }\n pinIndex++;\n }\n return undefined;\n }\n\n /**\n * Update the intermediate positions of a wire.\n * Update the wire in place.\n *\n * @param wireId - Wire to update\n * @param intermediatePositions - New intermediate positions\n * @param simplify - Whether to simplify positions by removing collinear points : useful when finalizing wire routing\n * @returns The updated Wire\n * @throws Error if wireId not found\n */\n updateWireIntermediatePositions(\n wireId: UUID,\n intermediatePositions: Position[],\n simplify: boolean = false\n ): Wire {\n const wire = this.wires.get(wireId);\n\n if (!wire) {\n throw new Error(`Wire ${wireId} does not exist`);\n }\n if (simplify) {\n // remove collinear positions if simplify\n const fullPositions = [\n this.enodes.get(wire.node1)!.getPosition(this),\n ...intermediatePositions,\n this.enodes.get(wire.node2)!.getPosition(this),\n ];\n const simplifiedFullPositions = simplifyPositions(fullPositions, 10);\n // remove first and last positions (they are the positions of the nodes)\n wire.intermediatePositions = simplifiedFullPositions.slice(\n 1,\n simplifiedFullPositions.length - 1\n );\n } else {\n wire.intermediatePositions = intermediatePositions;\n }\n\n return wire;\n }\n\n /**\n * Simplify intermediate positions of a wire.\n * Update the wire in place.\n * @param wireId - Wire to simplify\n * @returns The updated Wire\n * @throws Error if wireId not found\n */\n simplifyWireIntermediatePositions(wireId: UUID): Wire {\n const wire = this.wires.get(wireId);\n if (!wire) {\n throw new Error(`Wire ${wireId} does not exist`);\n }\n\n // remove collinear positions if simplify\n const fullPositions = [\n this.enodes.get(wire.node1)!.getPosition(this),\n ...wire.intermediatePositions,\n this.enodes.get(wire.node2)!.getPosition(this),\n ];\n const simplifiedFullPositions = simplifyPositions(fullPositions, 5);\n // remove first and last positions (they are the positions of the nodes)\n wire.intermediatePositions = simplifiedFullPositions.slice(\n 1,\n simplifiedFullPositions.length - 1\n );\n\n wire.intermediatePositions = simplifyPositions(wire.intermediatePositions);\n return wire;\n }\n\n /**\n * Update the source type of an ENode (branching point or component pin).\n * @param enodeId - ENode to update\n * @param sourceType - New source type (null to clear)\n * @throws Error if enodeId not found\n */\n updateENodeSourceType(enodeId: UUID, sourceType: ENodeSourceType | null): void {\n const enode = this.enodes.get(enodeId);\n\n if (!enode) {\n throw new Error(`ENode ${enodeId} does not exist`);\n }\n\n // Update sourceType (ENode.source is mutable)\n enode.source = sourceType || undefined;\n }\n\n /**\n * iterate through all components, enodes and wires positions to get the size that allows to enclose all elements.\n * @param margin - optional margin to add to the size\n * @returns size that allows to enclose all elements plus margin\n * @todo if calls to this method at each build operation ends causes slowness see to optimize by restricting checked elements\n */\n getEnclosingSize(margin: number = 0): number {\n let maxPos = 0;\n for (const component of this.components.values()) {\n maxPos = Math.max(maxPos, Math.abs(component.position.x), Math.abs(component.position.y));\n }\n for (const enode of this.enodes.values()) {\n if (enode.type === ENodeType.Pin) continue; // handled with components\n const pos = enode.position;\n if (!pos) continue;\n maxPos = Math.max(maxPos, Math.abs(pos.x), Math.abs(pos.y));\n }\n for (const wire of this.wires.values()) {\n for (const pos of wire.intermediatePositions) {\n maxPos = Math.max(maxPos, Math.abs(pos.x), Math.abs(pos.y));\n }\n }\n return Math.ceil(maxPos * 2 + Math.max(margin, 0));\n }\n\n /**\n * Serialize circuit to JSON.\n *\n * @returns JSON-serializable object containing all components, enodes, and wires\n *\n * @example\n * ```typescript\n * const json = circuit.toJSON();\n * localStorage.setItem('my-circuit', JSON.stringify(json));\n * ```\n */\n toJSON(): ICircuit {\n return {\n metadata: this.metadata.toJSON(),\n components: this.getAllComponents().map((c) => c.toJSON()),\n enodes: this.getAllENodes().map((e) => e.toJSON()),\n wires: this.getAllWires().map((w) => w.toJSON()),\n };\n }\n\n /**\n * Deserialize circuit from JSON.\n *\n * @param json - Circuit data\n * @returns Circuit instance\n * @throws {Error} If JSON is invalid or violates invariants\n *\n * @example\n * ```typescript\n * const jsonStr = localStorage.getItem('my-circuit');\n * const json = JSON.parse(jsonStr);\n * const circuit = Circuit.fromJSON(json);\n * ```\n */\n static fromJSON(json: ICircuit): Circuit {\n const finalMetadata = CircuitMetadata.fromJSON(json.metadata);\n const circuit = new Circuit(finalMetadata.options);\n circuit.metadata = finalMetadata;\n\n // Restore components\n for (const compData of json.components) {\n const component = Component.fromJSON(compData as IComponent);\n circuit.components.set(component.id, component);\n }\n\n // Restore ENodes\n for (const enodeData of json.enodes) {\n const enode = ENode.fromJSON(enodeData as IENode);\n circuit.enodes.set(enode.id, enode);\n }\n\n // Restore wires (if present)\n if (json.wires) {\n for (const wireData of json.wires) {\n const wire = Wire.fromJSON(wireData as IWire);\n circuit.wires.set(wire.id, wire);\n\n // Restore bidirectional references\n const enode1 = circuit.enodes.get(wire.node1);\n const enode2 = circuit.enodes.get(wire.node2);\n if (enode1) {\n enode1.wires.add(wire.id);\n }\n if (enode2) {\n enode2.wires.add(wire.id);\n }\n }\n }\n\n return circuit;\n }\n}\n","/**\n * Base state for all component types\n * @module core/simulation/states\n */\n\n\nimport type {UUID} from \"../../utils/types\";\n\n/**\n * Base class for component simulation state.\n * Extended by specific component types (BatteryState, LEDState, etc.)\n * One instance per component throughout simulation that will be mutated in place.\n *\n * @abstract\n * @public\n */\nexport abstract class ComponentState {\n /**\n * Component UUID this state belongs to.\n * @readonly\n */\n readonly componentId: UUID;\n\n /**\n * Current operational state (varies by component type).\n * Examples: \"on\", \"off\", \"open\", \"closed\", \"activating\", \"active\"\n */\n state: string;\n\n /**\n * Tick when this state started.\n */\n startTick: number;\n\n /**\n * Create a new component state.\n *\n * @param componentId - UUID of the component\n * @param initialState - Initial operational state\n */\n constructor(componentId: UUID, initialState: string) {\n this.componentId = componentId;\n this.state = initialState;\n this.startTick = 0;\n }\n\n hasSameComponent(other: ComponentState): boolean {\n return this.componentId === other.componentId;\n }\n}\n","/**\n * Battery component simulation state\n * @module core/simulation/states\n */\n\nimport { ComponentState } from '../ComponentState';\n\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for Battery components.\n * Batteries are stateless always-on pinSources.\n *\n * @public\n */\nexport class BatteryState extends ComponentState {\n /**\n * Create a new battery state.\n *\n * @param componentId - UUID of the battery component\n */\n constructor(componentId: UUID) {\n super(componentId, 'on');\n }\n}\n","/**\n * Lightbulb component simulation state\n * @module core/simulation/states\n */\n\nimport { ComponentState } from '../ComponentState';\n\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for Lightbulb components.\n * Lightbulbs can be \"on\" (emitting light) or \"off\".\n *\n * @public\n */\nexport class LightbulbState extends ComponentState {\n /**\n * Create a new Lightbulb state.\n *\n * @param componentId - UUID of the Lightbulb component\n * @param initialState - Initial operational state (default: \"off\")\n */\n constructor(componentId: UUID, initialState: string = 'off') {\n super(componentId, initialState);\n }\n\n /**\n * Check if Lightbulb is in lit state (on or going_on)\n */\n get isLit(): boolean {\n return this.state === 'on' || this.state === 'goingOn';\n }\n}\n","/**\n * LED component simulation state\n * @module core/simulation/states\n */\n\nimport { ComponentState } from '../ComponentState';\n\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for SmallLED components.\n * LEDs can be \"on\" (emitting light) or \"off\".\n *\n * @public\n */\nexport class SmallLEDState extends ComponentState {\n /**\n * Create a new SmallLED state.\n *\n * @param componentId - UUID of the LED component\n * @param initialState - Initial operational state (default: \"off\")\n */\n constructor(componentId: UUID, initialState: string = 'off') {\n super(componentId, initialState);\n }\n\n /**\n * Check if LED is in lit state (on or going_on)\n */\n get isLit(): boolean {\n return this.state === 'on' || this.state === 'goingOn';\n }\n}\n","import { SmallLEDState } from './SmallLEDState';\n\n/**\n * Simulation state for RectangleLED components. Same as SmallLEDState.\n * LEDs can be \"on\" (emitting light) or \"off\".\n *\n * @public\n */\nexport class RectangleLEDState extends SmallLEDState {}\n","/**\n * Relay component simulation state\n * @module core/simulation/states\n */\n\nimport { ComponentState } from '../ComponentState';\n\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for mechanical Relay components.\n * Relays can be \"open\", \"closing\", \"closed\", or \"opening\".\n *\n * @public\n */\nexport class RelayState extends ComponentState {\n /**\n * Create a new Relay state.\n *\n * @param componentId - UUID of the Relay component\n * @param initialState - Initial operational state (default: \"open\")\n */\n constructor(componentId: UUID, initialState: string = 'open') {\n super(componentId, initialState);\n }\n\n /**\n * Check if relay is in opening or closing state\n */\n get isInTransition(): boolean {\n return this.state === 'closing' || this.state === 'opening';\n }\n\n /**\n * Check if relay is in closed or closing state\n */\n get isClosed(): boolean {\n return this.state === 'closed' || this.state === 'closing';\n }\n}\n","/**\n * Switch component simulation state\n * @module core/simulation/states\n */\n\nimport { ComponentState } from '../ComponentState';\n\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for Switch components.\n * Switches can be \"open\", \"closing\", \"closed\", or \"opening\".\n *\n * @public\n */\nexport class SwitchState extends ComponentState {\n /**\n * Create a new Switch state.\n *\n * @param componentId - UUID of the Switch component\n * @param initialState - Initial operational state (default: \"open\")\n */\n constructor(componentId: UUID, initialState: string = 'open') {\n super(componentId, initialState);\n }\n\n /**\n * Check if switch is in opening or closing state\n */\n get isInTransition(): boolean {\n return this.state === 'closing' || this.state === 'opening';\n }\n\n /**\n * Check if switch is in closed or closing state\n */\n get isClosed(): boolean {\n return this.state === 'closed' || this.state === 'closing';\n }\n}\n","/**\n * Double Switch component simulation state\n * @module core/simulation/states\n */\n\nimport { ComponentState } from '../ComponentState';\n\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for DoubleSwitch (SPDT - Single-Pole Double-Throw - switch) components.\n * These switches can be \"input1\", \"1to2\", \"input2\" or \"2to1\"\n *\n * @public\n */\nexport class DoubleThrowSwitchState extends ComponentState {\n /**\n * Create a new double Switch state.\n *\n * @param componentId - UUID of the double Switch component\n * @param initialState - Initial operational state (default: \"input1\")\n */\n constructor(componentId: UUID, initialState: string = 'input1') {\n super(componentId, initialState);\n }\n\n /**\n * Check if switch is in 1to2 or 2to1 state\n */\n get isInTransition(): boolean {\n return this.state === '1to2' || this.state === '2to1';\n }\n}\n","/**\n * Logic gates components simulation state\n * @module core/simulation/states\n */\n\nimport { ComponentState } from '../ComponentState';\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for Logic gates components\n * Gates can be \"low\", \"rising\", \"high\", \"falling\" or \"indeterminate\" (if their input is not well-defined)\n *\n * @public\n */\nexport abstract class LogicGateState extends ComponentState {\n /**\n * Create a new Inverter state.\n *\n * @param componentId - UUID of the Inverter component\n * @param initialState - Initial operational state (default: \"low\")\n */\n protected constructor(componentId: UUID, initialState: string = 'low') {\n super(componentId, initialState);\n }\n\n /**\n * Check if output is in a rising or falling transition\n */\n get isInTransition(): boolean {\n return this.state === 'rising' || this.state === 'falling';\n }\n\n /**\n * Check if output is high\n */\n get isHigh(): boolean {\n return this.state === 'high';\n }\n}","/**\n * Inverter component simulation state\n * @module core/simulation/states\n */\n\nimport {LogicGateState} from \"./index\";\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for Inverter components\n * Inverters can be \"low\", \"rising\", \"high\", or \"falling\".\n *\n * @public\n */\nexport class InverterState extends LogicGateState {\n /**\n * Create a new Inverter state.\n *\n * @param componentId - UUID of the Inverter component\n * @param initialState - Initial operational state (default: \"low\")\n */\n constructor(componentId: UUID, initialState: string = 'low') {\n super(componentId, initialState);\n }\n}\n","/**\n * NAND Gate component simulation state\n * @module core/simulation/states\n */\n\nimport {LogicGateState} from \"./index\";\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for NAND Gate components.\n *\n * @public\n */\nexport class NandGateState extends LogicGateState {\n /**\n * Create a new NAND Gate state.\n *\n * @param componentId - UUID of the NAND Gate component\n * @param initialState - Initial operational state (default: \"low\")\n */\n constructor(componentId: UUID, initialState: string = 'low') {\n super(componentId, initialState);\n }\n}\n","/**\n * NAND4 Gate component simulation state\n * @module core/simulation/states\n */\n\nimport {LogicGateState} from \"./index\";\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for NAND4 Gate components (4 inputs).\n *\n * @public\n */\nexport class Nand4GateState extends LogicGateState {\n constructor(componentId: UUID, initialState: string = 'low') {\n super(componentId, initialState);\n }\n}\n","/**\n * NAND8 Gate component simulation state\n * @module core/simulation/states\n */\n\nimport {LogicGateState} from \"./index\";\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for NAND8 Gate components (8 inputs).\n *\n * @public\n */\nexport class Nand8GateState extends LogicGateState {\n constructor(componentId: UUID, initialState: string = 'low') {\n super(componentId, initialState);\n }\n}\n","/**\n * NOR Gate component simulation state\n * @module core/simulation/states\n */\n\nimport {LogicGateState} from \"./index\";\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for NOR Gate components.\n *\n * @public\n */\nexport class NorGateState extends LogicGateState {\n constructor(componentId: UUID, initialState: string = 'low') {\n super(componentId, initialState);\n }\n}\n","/**\n * NOR4 Gate component simulation state\n * @module core/simulation/states\n */\n\nimport {LogicGateState} from \"./index\";\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for NOR4 Gate components (4 inputs).\n *\n * @public\n */\nexport class Nor4GateState extends LogicGateState {\n constructor(componentId: UUID, initialState: string = 'low') {\n super(componentId, initialState);\n }\n}\n","/**\n * NOR8 Gate component simulation state\n * @module core/simulation/states\n */\n\nimport {LogicGateState} from \"./index\";\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for NOR8 Gate components (8 inputs).\n *\n * @public\n */\nexport class Nor8GateState extends LogicGateState {\n constructor(componentId: UUID, initialState: string = 'low') {\n super(componentId, initialState);\n }\n}\n","/**\n * XOR Gate component simulation state\n * @module core/simulation/states\n */\n\nimport {LogicGateState} from \"./index\";\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for XOR Gate components.\n *\n * @public\n */\nexport class XorGateState extends LogicGateState {\n constructor(componentId: UUID, initialState: string = 'low') {\n super(componentId, initialState);\n }\n}\n","/**\n * XOR4 Gate component simulation state\n * @module core/simulation/states\n */\n\nimport {LogicGateState} from \"./index\";\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for XOR4 Gate components (4 inputs).\n *\n * @public\n */\nexport class Xor4GateState extends LogicGateState {\n constructor(componentId: UUID, initialState: string = 'low') {\n super(componentId, initialState);\n }\n}\n","/**\n * XOR8 Gate component simulation state\n * @module core/simulation/states\n */\n\nimport {LogicGateState} from \"./index\";\nimport type {UUID} from \"../../../utils/types\";\n\n/**\n * Simulation state for XOR8 Gate components (8 inputs).\n *\n * @public\n */\nexport class Xor8GateState extends LogicGateState {\n constructor(componentId: UUID, initialState: string = 'low') {\n super(componentId, initialState);\n }\n}\n","/**\n * Registry for component behavior implementations\n * @module core/simulation/behaviors\n */\n\n\nimport type {IComponentBehavior} from \"./types\";\n\n/**\n * Registry for component behavior implementations.\n * Maps component types to their behavior handlers.\n *\n * This allows the simulation controller to be extended with new component types\n * without modifying core simulation logic.\n *\n * @public\n */\nexport class BehaviorRegistry {\n private behaviors: Map<string, IComponentBehavior>;\n\n /**\n * Create a new empty behavior registry.\n */\n constructor() {\n this.behaviors = new Map();\n }\n\n /**\n * Register a behavior for a component type.\n * Overwrites any existing behavior for the same type.\n *\n * @param behavior - The component behavior to register\n * @throws TypeError if behavior is null/undefined or componentType is empty\n * @returns The registry instance for chaining\n */\n register(behavior: IComponentBehavior): BehaviorRegistry {\n if (!behavior) {\n throw new TypeError('Behavior cannot be null or undefined');\n }\n\n if (!behavior.componentType || behavior.componentType.trim() === '') {\n throw new TypeError('Behavior componentType cannot be empty');\n }\n\n this.behaviors.set(behavior.componentType, behavior);\n return this;\n }\n\n /**\n * Register multiple behaviors at once.\n * Convenience method for bulk registration.\n *\n * @param behaviors - Array of behaviors to register\n */\n registerAll(behaviors: IComponentBehavior[]): void {\n behaviors.forEach((behavior) => this.register(behavior));\n }\n\n /**\n * Get the behavior for a component type.\n *\n * @param componentType - Type identifier (e.g., \"battery\", \"led\")\n * @returns The registered behavior, or undefined if not found\n */\n get(componentType: string): IComponentBehavior | undefined {\n return this.behaviors.get(componentType);\n }\n\n /**\n * Check if a behavior is registered for a component type.\n *\n * @param componentType - Type identifier to check\n * @returns True if behavior is registered\n */\n has(componentType: string): boolean {\n return this.behaviors.has(componentType);\n }\n\n /**\n * Unregister a behavior for a component type.\n *\n * @param componentType - Type identifier to unregister\n * @returns True if behavior was found and removed\n */\n unregister(componentType: string): boolean {\n return this.behaviors.delete(componentType);\n }\n\n /**\n * Clear all registered behaviors.\n */\n clear(): void {\n this.behaviors.clear();\n }\n\n /**\n * Get all registered component types.\n *\n * @returns Array of component type identifiers\n */\n getRegisteredTypes(): string[] {\n return Array.from(this.behaviors.keys());\n }\n\n /**\n * Get count of registered behaviors.\n *\n * @returns Number of registered behaviors\n */\n size(): number {\n return this.behaviors.size;\n }\n}\n","/**\n * Component behavior interface for registry-based extensibility\n * @module core/simulation/behaviors\n */\n\nimport type {Component} from '../../topology/Component';\nimport {ComponentState} from '../states/ComponentState.js';\nimport type {IScheduledEvent, IUserCommand} from '../types';\nimport type {IBehaviorResult} from \"./types\";\nimport type {INodeElectricalState} from \"../states/types\";\nimport type {UUID} from \"../../utils/types\";\nimport {\n ComponentType,\n type IComponentTypeMetadata,\n ENodeSourceType,\n COMPONENT_TYPE_METADATA\n} from \"../../topology/types\";\n\n/**\n * to factorize default implementations in component behaviors\n */\nexport abstract class ComponentBehaviorMixin {\n /**\n * Component type this behavior handles (e.g., \"battery\", \"led\", \"switch\").\n * Used as the key in BehaviorRegistry.\n */\n protected readonly _componentType: ComponentType;\n\n constructor(componentType: ComponentType) {\n this._componentType = componentType;\n }\n\n get componentType(): ComponentType {\n return this._componentType;\n }\n\n protected get typeMetadata(): IComponentTypeMetadata {\n const metadata = COMPONENT_TYPE_METADATA[this._componentType];\n if (!metadata) {\n throw new Error(`Unknown metadata for Component type ${this._componentType}`);\n }\n return metadata;\n }\n\n protected getPinStates(\n component: Component,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>\n ): Map<string, INodeElectricalState> {\n const pinStates: Map<string, INodeElectricalState> = new Map();\n for (const pinId of component.pins) {\n pinStates.set(component.getPinLabel(pinId)!, nodeStates.get(pinId as UUID)!);\n }\n return pinStates;\n }\n\n /**\n * Default: nothing happens\n * @param _component\n * @param componentState\n * @param _nodeStates\n * @param _targetTick\n */\n onPinsChange(\n _component: Component,\n componentState: ComponentState,\n _nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n _targetTick: number\n ): IBehaviorResult {\n\n return {\n componentState: componentState,\n hasChanged: false,\n shouldCancelPending: false,\n scheduledEvents: [],\n };\n }\n\n /**\n * Default: no conductivity between pins\n * @param _component\n * @param _state\n * @param _conductivityType\n * @param _pinId\n * @param _otherPinId\n */\n allowConductivity(\n _component: Component,\n _state: ComponentState,\n _conductivityType: ENodeSourceType,\n _pinId: string,\n _otherPinId: string\n ): boolean {\n return false;\n }\n\n onUserCommand(\n _component: Component,\n state: ComponentState,\n _command: IUserCommand\n ): IBehaviorResult {\n return {\n componentState: state,\n hasChanged: false,\n shouldCancelPending: false,\n scheduledEvents: [],\n };\n }\n\n onEventFiring(\n _component: Component,\n state: ComponentState,\n _event: IScheduledEvent\n ): IBehaviorResult {\n return {\n componentState: state,\n hasChanged: false,\n shouldCancelPending: false,\n scheduledEvents: [],\n };\n }\n}\n\n","/**\n * Battery component behavior implementation\n * @module core/simulation/behaviors\n */\n\nimport { Component } from '../../../topology/Component';\nimport {ComponentBehaviorMixin} from '../ComponentBehavior';\nimport { BatteryState } from '../../states/basic/BatteryState';\nimport type { ComponentState } from '../../states/ComponentState';\nimport type {IComponentBehavior} from \"../types\";\nimport {ComponentType} from \"../../../topology/types\";\n\nexport class BatteryBehavior extends ComponentBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.Battery);\n }\n\n /**\n * Create initial state for a battery.\n *\n * @param component - The Battery component\n * @returns Battery Initial state (always active and delivering voltage)\n */\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for BatteryBehavior: ${component.type}`);\n }\n return new BatteryState(component.id);\n }\n}\n","import type {Component} from '../../../topology/Component';\nimport {ComponentState} from '../../states/ComponentState.js';\nimport {type IScheduledEvent, TRANSITION_DEFAULTS} from '../../types';\nimport {ComponentBehaviorMixin} from '../ComponentBehavior';\nimport {ENodeSourceType} from \"../../../topology/types\";\nimport type {IBehaviorResult} from \"../types\";\n\n/**\n * to factorize behaviors of bipolar components emitting light (lightbulb/ LEDs even if it's a big simplification...)\n */\nexport abstract class BipolarLightEmitterBehaviorMixin extends ComponentBehaviorMixin {\n\n protected getBehavior(\n component: Component,\n state: ComponentState,\n activationCondition: boolean,\n targetTick: number\n ): IBehaviorResult {\n\n let hasChanged = false;\n const scheduledEvents: IScheduledEvent[] = [];\n\n if (activationCondition) {\n if (state.state === 'off' || state.state === 'goingOff') {\n hasChanged = true;\n state.state = 'goingOn';\n state.startTick = targetTick;\n scheduledEvents.push({\n targetId: component.id,\n scheduledAtTick: targetTick,\n readyAtTick: targetTick + 1, // TODO handle component config later ?\n type: 'GoingOnEnd',\n parameters: undefined,\n });\n state.state = 'goingOn';\n }\n } else {\n if (state.state === 'on' || state.state === 'goingOn') {\n hasChanged = true;\n state.state = 'goingOff';\n state.startTick = targetTick;\n scheduledEvents.push({\n targetId: component.id,\n scheduledAtTick: targetTick,\n readyAtTick: targetTick + 1, // TODO handle component config later ?\n type: 'GoingOffEnd',\n parameters: undefined,\n });\n state.state = 'goingOff';\n }\n }\n\n return {\n componentState: state,\n hasChanged: hasChanged,\n shouldCancelPending: false,\n scheduledEvents: scheduledEvents,\n };\n }\n\n override allowConductivity(\n _component: Component,\n _state: ComponentState,\n _conductivityType: ENodeSourceType,\n _pinId: string,\n _otherPinId: string\n ): boolean {\n return true; // TODO : see later if behavior changes for LEDs ?\n }\n\n override onEventFiring(\n _component: Component,\n state: ComponentState,\n event: IScheduledEvent\n ): IBehaviorResult {\n let hasChanged = false;\n\n if (event.type === 'GoingOffEnd') {\n if (state.state !== 'off') {\n hasChanged = true;\n state.startTick = event.readyAtTick;\n state.state = 'off';\n }\n } else if (event.type === 'GoingOnEnd') {\n if (state.state !== 'on') {\n hasChanged = true;\n state.startTick = event.readyAtTick;\n state.state = 'on';\n }\n }\n\n return {\n componentState: state,\n hasChanged: hasChanged,\n shouldCancelPending: false,\n scheduledEvents: [],\n };\n }\n}\n\n/**\n * Get the tick count from command parameters.\n * @param parameters - Command parameters map\n * @returns Number of ticks for transition (minimum 1)\n */\nexport function getTickCount(parameters: Map<string, string> | null | undefined): number {\n if (!parameters) {\n return TRANSITION_DEFAULTS.TRANSITION_SPAN_TICKS;\n }\n const value = parseInt(parameters.get('tickCount') || '', 10);\n if (isNaN(value) || value < 1) {\n return TRANSITION_DEFAULTS.TRANSITION_SPAN_TICKS;\n }\n return value;\n}","/**\n * lightbulb behavior implementation\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport type { ComponentState } from '../../states/ComponentState';\nimport { LightbulbState } from '../../states/basic/LightbulbState';\nimport {BipolarLightEmitterBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\nexport class LightbulbBehavior extends BipolarLightEmitterBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.Lightbulb);\n }\n\n /**\n * Create initial state for a lightbulb.\n *\n * @param component - The lightbulb component\n * @returns lightbulbInitial state (always active and delivering voltage)\n */\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for lightbulbBehavior: ${component.type}`);\n }\n return new LightbulbState(component.id);\n }\n\n /**\n * @param component\n * @param state\n * @param nodeStates\n * @param targetTick\n */\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n\n let activationCondition =\n (pinStates.get('pin1')!.hasVoltage && pinStates.get('pin1')!.hasCurrent) ||\n (pinStates.get('pin2')!.hasVoltage && pinStates.get('pin2')!.hasCurrent) ||\n (pinStates.get('pin1')!.hasVoltage && pinStates.get('pin2')!.hasCurrent) ||\n (pinStates.get('pin2')!.hasVoltage && pinStates.get('pin1')!.hasCurrent);\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * RectangleLED component behavior implementation (just an extension of SmallLEDBehavior)\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport type { ComponentState } from '../../states/ComponentState';\nimport { RectangleLEDState } from '../../states/basic/RectangleLEDState';\nimport type {INodeElectricalState} from \"../../states\";\nimport {BipolarLightEmitterBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\nexport class RectangleLEDBehavior extends BipolarLightEmitterBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.RectangleLED);\n }\n\n /**\n * Create initial state for a RectangleLED.\n *\n * @param component - The smallLED component\n * @returns LED Initial state (always active and delivering voltage)\n */\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for RectangleLEDBehavior: ${component.type}`);\n }\n return new RectangleLEDState(component.id);\n }\n\n /**\n * only symmetrical behavior of LEDS is handled for now\n * @param component\n * @param state\n * @param nodeStates\n * @param targetTick\n */\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n\n let activationCondition =\n (pinStates.get('pin2')!.hasVoltage && pinStates.get('pin2')!.hasCurrent) ||\n (pinStates.get('pin1')!.hasVoltage && pinStates.get('pin1')!.hasCurrent) ||\n (pinStates.get('pin2')!.hasVoltage && pinStates.get('pin1')!.hasCurrent) ||\n (pinStates.get('pin1')!.hasVoltage && pinStates.get('pin2')!.hasCurrent);\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * relay component behavior implementation\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport type { ComponentState } from '../../states/ComponentState';\nimport {type IScheduledEvent, TRANSITION_DEFAULTS} from '../../types';\nimport {ComponentBehaviorMixin} from '../ComponentBehavior';\nimport { RelayState } from '../../states/basic/RelayState';\n\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType, ENodeSourceType} from \"../../../topology/types\";\n\n/**\n * Get the transition span from component config.\n * @param config - Component config map\n * @returns Number of ticks for transition (minimum 1)\n */\nfunction getTransitionSpan(config: Map<string, string>): number {\n const value = parseInt(config.get('transitionSpan') || '', 10);\n if (isNaN(value) || value < 1) {\n return TRANSITION_DEFAULTS.TRANSITION_SPAN_TICKS;\n }\n return value;\n}\n\n/**\n * Behavior implementation for relays components.\n *\n * @public\n */\nexport class RelayBehavior extends ComponentBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.Relay);\n }\n\n /**\n * Create initial state for a relay.\n *\n * @param component - The Relay component\n * @returns Relay Initial state (open by default)\n */\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for RelayBehavior: ${component.type}`);\n }\n const state = component.config.get('activationLogic') === 'negative' ? 'closed' : 'open';\n return new RelayState(component.id, state);\n }\n\n override allowConductivity(\n component: Component,\n state: ComponentState,\n _conductivityType: ENodeSourceType,\n pinId: string,\n otherPinId: string\n ): boolean {\n if (pinId === otherPinId) return true;\n const pinLabel = component.getPinLabel(pinId);\n const otherPinLabel = component.getPinLabel(otherPinId);\n if (!pinLabel || !otherPinLabel) return false;\n const pinLabels = [pinLabel, otherPinLabel];\n\n if (pinLabels.includes('cmd_in') && pinLabels.includes('cmd_out')) {\n return true;\n }\n if (pinLabels.includes('power_in') && pinLabels.includes('power_out')) {\n return state.state === 'closed' || state.state === 'opening';\n }\n return false;\n }\n\n /**\n * Relay cmd pins need to have voltage and current so that relay contactor stays closed\n * @param component\n * @param state\n * @param nodeStates\n * @param targetTick\n */\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n\n const isCommanded =\n (pinStates.get('cmd_in')!.hasVoltage && pinStates.get('cmd_in')!.hasCurrent) ||\n (pinStates.get('cmd_out')!.hasVoltage && pinStates.get('cmd_out')!.hasCurrent) ||\n (pinStates.get('cmd_in')!.hasVoltage && pinStates.get('cmd_out')!.hasCurrent) ||\n (pinStates.get('cmd_out')!.hasVoltage && pinStates.get('cmd_in')!.hasCurrent);\n\n const shouldBeClosed =\n component.config.get('activationLogic') === 'negative' ? !isCommanded : isCommanded;\n\n let hasChanged = false;\n const scheduledEvents: IScheduledEvent[] = [];\n const transitionSpan = getTransitionSpan(component.config);\n\n if (shouldBeClosed) {\n if (state.state === 'open' || state.state === 'opening') {\n hasChanged = true;\n state.state = 'closing';\n state.startTick = targetTick;\n scheduledEvents.push({\n targetId: component.id,\n scheduledAtTick: targetTick,\n readyAtTick: targetTick + transitionSpan,\n type: 'ClosingEnd',\n parameters: undefined,\n });\n }\n } else {\n if (state.state === 'closed' || state.state === 'closing') {\n hasChanged = true;\n state.state = 'opening';\n state.startTick = targetTick;\n scheduledEvents.push({\n targetId: component.id,\n scheduledAtTick: targetTick,\n readyAtTick: targetTick + transitionSpan,\n type: 'OpeningEnd',\n parameters: undefined,\n });\n }\n }\n\n return {\n componentState: state,\n hasChanged: hasChanged,\n shouldCancelPending: false,\n scheduledEvents: scheduledEvents,\n };\n }\n\n override onEventFiring(\n _component: Component,\n state: ComponentState,\n event: IScheduledEvent\n ): IBehaviorResult {\n let hasChanged = false;\n\n if (event.type === 'ClosingEnd') {\n if (state.state !== 'closed') {\n hasChanged = true;\n state.startTick = event.readyAtTick;\n state.state = 'closed';\n }\n } else if (event.type === 'OpeningEnd') {\n if (state.state !== 'open') {\n hasChanged = true;\n state.startTick = event.readyAtTick;\n state.state = 'open';\n }\n }\n\n return {\n componentState: state,\n hasChanged: hasChanged,\n shouldCancelPending: false,\n scheduledEvents: [],\n };\n }\n}\n","/**\n * LED component behavior implementation\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport { SmallLEDState } from '../../states/basic/SmallLEDState';\nimport type { ComponentState } from '../../states/ComponentState';\nimport {BipolarLightEmitterBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\nexport class SmallLEDBehavior extends BipolarLightEmitterBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.SmallLED);\n }\n\n /**\n * Create initial state for a smallLED.\n *\n * @param component - The smallLED component\n * @returns LED Initial state (always active and delivering voltage)\n */\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for SmallLEDBehavior: ${component.type}`);\n }\n return new SmallLEDState(component.id);\n }\n\n /**\n * only symmetrical behavior of LEDS is handled for now\n * @param component\n * @param state\n * @param nodeStates\n * @param targetTick\n */\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n\n let activationCondition =\n (pinStates.get('pin2')!.hasVoltage && pinStates.get('pin2')!.hasCurrent) ||\n (pinStates.get('pin1')!.hasVoltage && pinStates.get('pin1')!.hasCurrent) ||\n (pinStates.get('pin2')!.hasVoltage && pinStates.get('pin1')!.hasCurrent) ||\n (pinStates.get('pin1')!.hasVoltage && pinStates.get('pin2')!.hasCurrent);\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * switch component behavior implementation\n * @module core/simulation/behaviors\n */\n\nimport type {Component} from '../../../topology/Component';\nimport type {ComponentState} from '../../states';\nimport {SwitchState} from '../../states';\nimport type {IScheduledEvent, IUserCommand} from '../../types';\nimport {ComponentBehaviorMixin} from '../ComponentBehavior';\nimport {getTickCount} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport {ComponentType, ENodeSourceType} from \"../../../topology/types\";\n\n/**\n * Behavior implementation for switches components.\n *\n * @public\n */\nexport class SwitchBehavior extends ComponentBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.Switch);\n }\n\n /**\n * Create initial state for a switch.\n *\n * @param component - The Switch component\n * @returns Switch Initial state (open by default)\n */\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for SwitchBehavior: ${component.type}`);\n }\n const state = component.config.get('initialState') || 'open';\n return new SwitchState(component.id, state);\n }\n\n override allowConductivity(\n _component: Component,\n _state: ComponentState,\n _conductivityType: ENodeSourceType,\n _pinId: string,\n _otherPinId: string\n ): boolean {\n return _state.state === 'closed' || _state.state === 'opening';\n }\n\n override onUserCommand(component: Component, state: ComponentState, command: IUserCommand): IBehaviorResult {\n let hasChanged = false;\n const scheduledEvents: IScheduledEvent[] = [];\n\n if (command.type === 'toggle_switch' && ['open', 'closed'].includes(state.state)) {\n state.state = state.state === 'open' ? 'closing' : 'opening';\n state.startTick = command.scheduledAtTick + 1;\n hasChanged = true;\n\n const tickCount = getTickCount(command.parameters);\n scheduledEvents.push({\n targetId: component.id,\n scheduledAtTick: state.startTick,\n readyAtTick: state.startTick + tickCount,\n type: state.state === 'closing' ? 'ClosingEnd' : 'OpeningEnd',\n parameters: undefined,\n });\n }\n\n return {\n componentState: state,\n hasChanged: hasChanged,\n shouldCancelPending: false,\n scheduledEvents: scheduledEvents,\n };\n }\n\n override onEventFiring(\n _component: Component,\n state: ComponentState,\n event: IScheduledEvent\n ): IBehaviorResult {\n let hasChanged = false;\n\n if (event.type === 'ClosingEnd') {\n if (state.state !== 'closed') {\n hasChanged = true;\n state.startTick = event.readyAtTick;\n state.state = 'closed';\n }\n } else if (event.type === 'OpeningEnd') {\n if (state.state !== 'open') {\n hasChanged = true;\n state.startTick = event.readyAtTick;\n state.state = 'open';\n }\n }\n\n return {\n componentState: state,\n hasChanged: hasChanged,\n shouldCancelPending: false,\n scheduledEvents: [],\n };\n }\n}\n","/**\n * Double switch component behavior implementation\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport {type ComponentState, DoubleThrowSwitchState} from '../../states';\nimport type { IScheduledEvent, IUserCommand } from '../../types';\nimport {ComponentBehaviorMixin} from '../ComponentBehavior';\nimport {getTickCount} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport {ComponentType, ENodeSourceType} from \"../../../topology/types\";\n\n\n\n/**\n * Behavior implementation for switches components.\n *\n * @public\n */\nexport class DoubleThrowSwitchBehavior extends ComponentBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.DoubleThrowSwitch);\n }\n\n /**\n * Create initial state for a double throw switch (SPDT).\n *\n * @param component - The double Switch component\n * @returns double Switch Initial state (input1 by default)\n */\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for DoubleThrowSwitchBehavior: ${component.type}`);\n }\n const state = component.config.get('initialState') || 'input1';\n return new DoubleThrowSwitchState(component.id, state);\n }\n\n override allowConductivity(\n component: Component,\n state: ComponentState,\n _conductivityType: ENodeSourceType,\n pinId: string,\n otherPinId: string\n ): boolean {\n if (pinId === otherPinId) return true;\n const pinLabel = component.getPinLabel(pinId);\n const otherPinLabel = component.getPinLabel(otherPinId);\n if (!pinLabel || !otherPinLabel) return false;\n const pinLabels = [pinLabel, otherPinLabel];\n\n if (pinLabels.includes('output') && pinLabels.includes('input1')) {\n return state.state === 'input1' || state.state === '1to2';\n }\n if (pinLabels.includes('output') && pinLabels.includes('input2')) {\n return state.state === 'input2' || state.state === '2to1';\n }\n return false;\n }\n\n override onUserCommand(component: Component, state: ComponentState, command: IUserCommand): IBehaviorResult {\n let hasChanged = false;\n const scheduledEvents: IScheduledEvent[] = [];\n\n if (command.type === 'toggle_switch' && ['input1', 'input2'].includes(state.state)) {\n state.state = state.state === 'input1' ? '1to2' : '2to1';\n state.startTick = command.scheduledAtTick + 1;\n hasChanged = true;\n\n const tickCount = getTickCount(command.parameters);\n scheduledEvents.push({\n targetId: component.id,\n scheduledAtTick: state.startTick,\n readyAtTick: state.startTick + tickCount,\n type: state.state === '1to2' ? 'ContactedInput2' : 'ContactedInput1',\n parameters: undefined,\n });\n }\n\n return {\n componentState: state,\n hasChanged: hasChanged,\n shouldCancelPending: false,\n scheduledEvents: scheduledEvents,\n };\n }\n\n override onEventFiring(\n _component: Component,\n state: ComponentState,\n event: IScheduledEvent\n ): IBehaviorResult {\n let hasChanged = false;\n\n if (event.type === 'ContactedInput2') {\n if (state.state !== 'input2') {\n hasChanged = true;\n state.startTick = event.readyAtTick;\n state.state = 'input2';\n }\n } else if (event.type === 'ContactedInput1') {\n if (state.state !== 'input1') {\n hasChanged = true;\n state.startTick = event.readyAtTick;\n state.state = 'input1';\n }\n }\n\n return {\n componentState: state,\n hasChanged: hasChanged,\n shouldCancelPending: false,\n scheduledEvents: [],\n };\n }\n}\n","import type {Component} from '../../../topology/Component';\nimport {ComponentState} from '../../states/ComponentState.js';\nimport {type IScheduledEvent, TRANSITION_DEFAULTS} from '../../types';\nimport {ComponentBehaviorMixin} from '../ComponentBehavior';\nimport {ENodeSourceType, type IBehaviorResult, type INodeElectricalState} from \"simple-circuit-engine/core\";\n\n/**\n * Get the transition span from component config.\n * @param config - Component config map\n * @returns Number of ticks for transition (minimum 1)\n */\nexport function getTransitionSpan(config: Map<string, string>): number {\n const value = parseInt(config.get('transitionSpan') || '', 10);\n if (isNaN(value) || value < 1) {\n return TRANSITION_DEFAULTS.TRANSITION_SPAN_TICKS;\n }\n return value;\n}\n\n/**\n * to factorize default implementations in logic gates behaviors\n */\nexport abstract class LogicGateBehaviorMixin extends ComponentBehaviorMixin {\n\n /**\n * default return for all logic gates when vcc fails -> go low immediately\n * @param state\n * @param pinStates\n * @protected\n */\n protected vccGuardBehavior(\n state: ComponentState,\n pinStates: Map<string, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult | null {\n const vccVoltage = pinStates.get('vcc')!.hasVoltage;\n if (vccVoltage) {\n return null;\n }\n\n // go low immediately if no voltage\n state.startTick = state.state === 'low' ? state.startTick : targetTick; // if component was already low we keep this startTick\n const hasChanged = state.state !== 'low';\n const shouldCancelPending = state.state !== 'low';\n state.state = 'low'; // no vcc voltage -> nothing immediately\n return {\n componentState: state,\n hasChanged: hasChanged,\n shouldCancelPending: shouldCancelPending,\n scheduledEvents: [],\n };\n }\n\n /**\n * guard scanning all inputs of logic gates to detect if Any has:\n * - both voltage and ground hence with established flowing current\n * - neither voltage nor ground\n * it makes a not well-defined input between LOW and HIGH\n * in that case gate goes to state indeterminate and output nothing too\n * @param state\n * @param pinStates\n * @param targetTick\n * @protected\n */\n protected nonLogicInputGuardBehavior(\n state: ComponentState,\n pinStates: Map<string, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult | null {\n\n let activateGuard = false;\n\n const pinsMeta = this.typeMetadata.pins;\n for (const [pinLabel, pinState] of pinStates) {\n if (!pinsMeta.has(pinLabel)) continue;\n const pinMeta = pinsMeta.get(pinLabel);\n if (!pinMeta) continue; // shouldn't occur but here as technical let pass\n if (pinMeta?.subtype !== 'logicInput') continue;\n // case both voltage and ground\n if (pinState.hasVoltage && pinState.hasCurrent) {\n activateGuard = true;\n break;\n }\n // case neither voltage nor ground\n if (!pinState.hasVoltage && !pinState.hasCurrent) {\n activateGuard = true;\n break;\n }\n }\n\n if (!activateGuard) {\n return null;\n }\n\n // go indeterminate immediately\n state.startTick = state.state === 'indeterminate' ? state.startTick : targetTick; // if component was already indeterminate we keep this startTick\n const hasChanged = state.state !== 'indeterminate';\n const shouldCancelPending = state.state !== 'indeterminate';\n state.state = 'indeterminate';\n return {\n componentState: state,\n hasChanged: hasChanged,\n shouldCancelPending: shouldCancelPending,\n scheduledEvents: [],\n };\n }\n\n protected getBehavior(\n component: Component,\n state: ComponentState,\n activationCondition: boolean,\n targetTick: number\n ): IBehaviorResult {\n\n const transitionSpan = getTransitionSpan(component.config);\n // technical guard clause: if state isn't a known value it's considered low (shouldn't happen but allow to simplify logic beneath)\n if(!['low', 'rising', 'high', 'falling', 'indeterminate'].includes(state.state)){\n state.state = 'low';\n }\n\n if (activationCondition) {\n if(state.state === 'low' || state.state === 'indeterminate'){\n state.state = 'rising';\n state.startTick = targetTick;\n return {\n componentState: state,\n hasChanged: true,\n shouldCancelPending: false,\n scheduledEvents: [{\n targetId: component.id,\n scheduledAtTick: targetTick,\n readyAtTick: targetTick + transitionSpan,\n type: 'RisingComplete',\n parameters: undefined,\n }],\n };\n }\n if(state.state === 'rising' || state.state === 'high'){\n // still rising or high\n return {\n componentState: state,\n hasChanged: false,\n shouldCancelPending: false,\n scheduledEvents: [],\n };\n }\n // last case: falling\n state.state = 'high';\n return {\n componentState: state,\n hasChanged: true,\n shouldCancelPending: true, // goes back to high immediately and cancel pending FallingComplete event\n scheduledEvents: [],\n };\n }\n // case should deactivate\n if(state.state === 'falling' || state.state === 'low'){\n // still falling or low\n return {\n componentState: state,\n hasChanged: false,\n shouldCancelPending: false,\n scheduledEvents: [],\n };\n }\n if(state.state === 'high'){\n state.state = 'falling';\n state.startTick = targetTick;\n return {\n componentState: state,\n hasChanged: true,\n shouldCancelPending: false,\n scheduledEvents: [{\n targetId: component.id,\n scheduledAtTick: targetTick,\n readyAtTick: targetTick + transitionSpan,\n type: 'FallingComplete',\n parameters: undefined,\n }],\n };\n }\n // last case: rising or indeterminate\n state.state = 'low';\n return {\n componentState: state,\n hasChanged: true,\n shouldCancelPending: true, // goes back to low immediately and cancel pending RisingComplete event\n scheduledEvents: [],\n };\n }\n\n override allowConductivity(\n component: Component,\n state: ComponentState,\n _conductivityType: ENodeSourceType,\n pinId: string,\n otherPinId: string\n ): boolean {\n if (pinId === otherPinId) return true;\n const pinLabel = component.getPinLabel(pinId);\n const otherPinLabel = component.getPinLabel(otherPinId);\n if (!pinLabel || !otherPinLabel) return false;\n const pinLabels = [pinLabel, otherPinLabel];\n\n if (pinLabels.includes('vcc') && pinLabels.includes('output')) {\n return state.state === 'high' || state.state === 'falling';\n }\n if (pinLabels.includes('gnd') && pinLabels.includes('output')) {\n return state.state === 'low' || state.state === 'rising';\n }\n return false;\n }\n\n override onEventFiring(\n _component: Component,\n state: ComponentState,\n event: IScheduledEvent\n ): IBehaviorResult {\n let hasChanged = false;\n\n if (event.type === 'RisingComplete') {\n if (state.state !== 'high') {\n hasChanged = true;\n state.startTick = event.readyAtTick;\n state.state = 'high';\n }\n } else if (event.type === 'FallingComplete') {\n if (state.state !== 'low') {\n hasChanged = true;\n state.startTick = event.readyAtTick;\n state.state = 'low';\n }\n }\n\n return {\n componentState: state,\n hasChanged: hasChanged,\n shouldCancelPending: false,\n scheduledEvents: [],\n };\n }\n}\n\n","/**\n * Inverter component behavior implementation\n * @module core/simulation/behaviors\n */\n\nimport type {Component} from '../../../topology/Component';\nimport {type ComponentState} from '../../states/ComponentState';\nimport {InverterState} from '../../states/gates/InverterState';\nimport { LogicGateBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\n/**\n * Behavior implementation for Inverters components.\n *\n * @public\n */\nexport class InverterBehavior extends LogicGateBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.Inverter);\n }\n\n /**\n * Create initial state for a Inverter.\n *\n * @param component - The Inverter component\n * @returns Inverter Initial state (HIGH if input LOW, LOW if input LOW for positive activation logic)\n */\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for InverterBehavior: ${component.type}`);\n }\n const state = component.config.get('activationLogic') === 'negative' ? 'high' : 'low';\n return new InverterState(component.id, state);\n }\n\n /**\n * Inverter needs LOW on input to drive the output HIGH, and on the contrary Buffer needs HIGH on input to output HIGH\n * @param component\n * @param state\n * @param nodeStates\n * @param targetTick\n */\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n const vccGuardBehavior = this.vccGuardBehavior(state, pinStates, targetTick);\n if(vccGuardBehavior) {\n return vccGuardBehavior;\n }\n const nonLogicInputGuardBehavior = this.nonLogicInputGuardBehavior(state, pinStates, targetTick);\n if(nonLogicInputGuardBehavior) {\n return nonLogicInputGuardBehavior;\n }\n\n const isCommanded = pinStates.get('input')!.hasVoltage;\n const activationCondition =\n component.config.get('activationLogic') === 'negative' ? !isCommanded : isCommanded;\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * NAND Gate component behavior implementation\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport type { ComponentState } from '../../states/ComponentState';\nimport { NandGateState } from '../../states/gates/NandGateState';\nimport {LogicGateBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\n/**\n * Behavior implementation for NAND Gate components.\n * With negative (default) activationLogic: NAND gate (output high when ANY input is low).\n * With positive activationLogic: AND gate (output high when ALL inputs are high).\n *\n * @public\n */\nexport class NandGateBehavior extends LogicGateBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.NandGate);\n }\n\n /**\n * Create initial state for an NAND Gate.\n *\n * @param component - The NAND Gate component\n * @returns Initial state (low by default, high for negative activation logic)\n */\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for NandGateBehavior: ${component.type}`);\n }\n const state = component.config.get('activationLogic') === 'negative' ? 'high' : 'low';\n return new NandGateState(component.id, state);\n }\n\n /**\n * NAND gate output goes high when ANY inputs LACK voltage.\n * With positive activationLogic (AND), output goes high when ALL inputs HAS voltage.\n */\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n const vccGuardBehavior = this.vccGuardBehavior(state, pinStates, targetTick);\n if(vccGuardBehavior) {\n return vccGuardBehavior;\n }\n const nonLogicInputGuardBehavior = this.nonLogicInputGuardBehavior(state, pinStates, targetTick);\n if(nonLogicInputGuardBehavior) {\n return nonLogicInputGuardBehavior;\n }\n\n const allInputsHigh =\n pinStates.get('input1')!.hasVoltage && pinStates.get('input2')!.hasVoltage;\n\n const activationCondition =\n component.config.get('activationLogic') === 'negative' ? !allInputsHigh : allInputsHigh;\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * NAND4 Gate component behavior implementation (4 inputs)\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport type { ComponentState } from '../../states/ComponentState';\nimport { Nand4GateState } from '../../states/gates/Nand4GateState';\nimport {LogicGateBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\n/**\n * Behavior implementation for NAND4 Gate components (4 inputs).\n * With negative (default) activationLogic: NAND gate (output high when ANY input is low).\n * With positive activationLogic: AND gate (output high when ALL 4 inputs are high).\n *\n * @public\n */\nexport class Nand4GateBehavior extends LogicGateBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.Nand4Gate);\n }\n\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for Nand4GateBehavior: ${component.type}`);\n }\n const state = component.config.get('activationLogic') === 'negative' ? 'high' : 'low';\n return new Nand4GateState(component.id, state);\n }\n\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n const vccGuardBehavior = this.vccGuardBehavior(state, pinStates, targetTick);\n if(vccGuardBehavior) {\n return vccGuardBehavior;\n }\n const nonLogicInputGuardBehavior = this.nonLogicInputGuardBehavior(state, pinStates, targetTick);\n if(nonLogicInputGuardBehavior) {\n return nonLogicInputGuardBehavior;\n }\n\n const allInputsHigh =\n pinStates.get('input1')!.hasVoltage &&\n pinStates.get('input2')!.hasVoltage &&\n pinStates.get('input3')!.hasVoltage &&\n pinStates.get('input4')!.hasVoltage;\n\n const activationCondition =\n component.config.get('activationLogic') === 'negative' ? !allInputsHigh : allInputsHigh;\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * NAND8 Gate component behavior implementation (8 inputs)\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport type { ComponentState } from '../../states/ComponentState';\nimport { Nand8GateState } from '../../states/gates/Nand8GateState';\nimport {LogicGateBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states/types\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\n/**\n * Behavior implementation for NAND8 Gate components (8 inputs).\n * With negative (default) activationLogic: NAND gate (output high when ANY input is low).\n * With positive activationLogic: AND gate (output high when ALL 8 inputs are high).\n *\n * @public\n */\nexport class Nand8GateBehavior extends LogicGateBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.Nand8Gate);\n }\n\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for Nand8GateBehavior: ${component.type}`);\n }\n const state = component.config.get('activationLogic') === 'negative' ? 'high' : 'low';\n return new Nand8GateState(component.id, state);\n }\n\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n const vccGuardBehavior = this.vccGuardBehavior(state, pinStates, targetTick);\n if(vccGuardBehavior) {\n return vccGuardBehavior;\n }\n const nonLogicInputGuardBehavior = this.nonLogicInputGuardBehavior(state, pinStates, targetTick);\n if(nonLogicInputGuardBehavior) {\n return nonLogicInputGuardBehavior;\n }\n\n const allInputsHigh =\n pinStates.get('input1')!.hasVoltage &&\n pinStates.get('input2')!.hasVoltage &&\n pinStates.get('input3')!.hasVoltage &&\n pinStates.get('input4')!.hasVoltage &&\n pinStates.get('input5')!.hasVoltage &&\n pinStates.get('input6')!.hasVoltage &&\n pinStates.get('input7')!.hasVoltage &&\n pinStates.get('input8')!.hasVoltage;\n\n const activationCondition =\n component.config.get('activationLogic') === 'negative' ? !allInputsHigh : allInputsHigh;\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * NOR Gate component behavior implementation\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport type { ComponentState } from '../../states/ComponentState';\nimport { NorGateState } from '../../states/gates/NorGateState';\nimport {LogicGateBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states/types\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\n/**\n * Behavior implementation for NOR Gate components.\n * With negative (default) activationLogic: NOR gate (output high when ALL inputs are low).\n * With positive activationLogic: OR gate (output high when ANY input is high).\n *\n * @public\n */\nexport class NorGateBehavior extends LogicGateBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.NorGate);\n }\n\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for NorGateBehavior: ${component.type}`);\n }\n const state = component.config.get('activationLogic') === 'negative' ? 'high' : 'low';\n return new NorGateState(component.id, state);\n }\n\n /**\n * NOR gate output goes high when ALL inputs LACK voltage.\n * With positive activationLogic (OR), output goes high when ANY inputs HAS voltage.\n */\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n const vccGuardBehavior = this.vccGuardBehavior(state, pinStates, targetTick);\n if(vccGuardBehavior) {\n return vccGuardBehavior;\n }\n const nonLogicInputGuardBehavior = this.nonLogicInputGuardBehavior(state, pinStates, targetTick);\n if(nonLogicInputGuardBehavior) {\n return nonLogicInputGuardBehavior;\n }\n\n const anyInputHigh = pinStates.get('input1')!.hasVoltage || pinStates.get('input2')!.hasVoltage;\n\n const activationCondition =\n component.config.get('activationLogic') === 'negative' ? !anyInputHigh : anyInputHigh;\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * NOR4 Gate component behavior implementation (4 inputs)\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport type { ComponentState } from '../../states/ComponentState';\nimport { Nor4GateState } from '../../states/gates/Nor4GateState';\nimport {LogicGateBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\n/**\n * Behavior implementation for NOR4 Gate components (4 inputs).\n * With negative (default) activationLogic: NOR gate (output high when ALL 4 inputs are low).\n * With positive activationLogic: OR gate (output high when ANY of 4 inputs is high).\n *\n * @public\n */\nexport class Nor4GateBehavior extends LogicGateBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.Nor4Gate);\n }\n\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for Nor4GateBehavior: ${component.type}`);\n }\n const state = component.config.get('activationLogic') === 'negative' ? 'high' : 'low';\n return new Nor4GateState(component.id, state);\n }\n\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n const vccGuardBehavior = this.vccGuardBehavior(state, pinStates, targetTick);\n if(vccGuardBehavior) {\n return vccGuardBehavior;\n }\n const nonLogicInputGuardBehavior = this.nonLogicInputGuardBehavior(state, pinStates, targetTick);\n if(nonLogicInputGuardBehavior) {\n return nonLogicInputGuardBehavior;\n }\n\n const anyInputHigh =\n pinStates.get('input1')!.hasVoltage ||\n pinStates.get('input2')!.hasVoltage ||\n pinStates.get('input3')!.hasVoltage ||\n pinStates.get('input4')!.hasVoltage;\n\n const activationCondition =\n component.config.get('activationLogic') === 'negative' ? !anyInputHigh : anyInputHigh;\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * NOR8 Gate component behavior implementation (8 inputs)\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport type { ComponentState } from '../../states/ComponentState';\nimport { Nor8GateState } from '../../states/gates/Nor8GateState';\nimport {LogicGateBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\n/**\n * Behavior implementation for NOR8 Gate components (8 inputs).\n * With negative (default) activationLogic: NOR gate (output high when ALL 8 inputs are low).\n * With positive activationLogic: OR gate (output high when ANY of 8 inputs is high).\n *\n * @public\n */\nexport class Nor8GateBehavior extends LogicGateBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.Nor8Gate);\n }\n\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for Nor8GateBehavior: ${component.type}`);\n }\n const state = component.config.get('activationLogic') === 'negative' ? 'high' : 'low';\n return new Nor8GateState(component.id, state);\n }\n\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n const vccGuardBehavior = this.vccGuardBehavior(state, pinStates, targetTick);\n if(vccGuardBehavior) {\n return vccGuardBehavior;\n }\n const nonLogicInputGuardBehavior = this.nonLogicInputGuardBehavior(state, pinStates, targetTick);\n if(nonLogicInputGuardBehavior) {\n return nonLogicInputGuardBehavior;\n }\n\n const anyInputHigh =\n pinStates.get('input1')!.hasVoltage ||\n pinStates.get('input2')!.hasVoltage ||\n pinStates.get('input3')!.hasVoltage ||\n pinStates.get('input4')!.hasVoltage ||\n pinStates.get('input5')!.hasVoltage ||\n pinStates.get('input6')!.hasVoltage ||\n pinStates.get('input7')!.hasVoltage ||\n pinStates.get('input8')!.hasVoltage;\n\n const activationCondition =\n component.config.get('activationLogic') === 'negative' ? !anyInputHigh : anyInputHigh;\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * XOR Gate component behavior implementation\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport type { ComponentState } from '../../states/ComponentState';\nimport { XorGateState } from '../../states/gates/XorGateState';\nimport {LogicGateBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\n/**\n * Behavior implementation for XOR Gate components.\n * With positive activationLogic: XOR gate (output high when inputs differ / odd parity).\n * With negative activationLogic: XNOR gate (output high when inputs are equal / even parity).\n *\n * @public\n */\nexport class XorGateBehavior extends LogicGateBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.XorGate);\n }\n\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for XorGateBehavior: ${component.type}`);\n }\n const state = component.config.get('activationLogic') === 'negative' ? 'high' : 'low';\n return new XorGateState(component.id, state);\n }\n\n /**\n * XOR gate output goes high when inputs differ (odd parity).\n * With negative activationLogic (XNOR), output goes high when inputs are equal (even parity).\n */\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n const vccGuardBehavior = this.vccGuardBehavior(state, pinStates, targetTick);\n if(vccGuardBehavior) {\n return vccGuardBehavior;\n }\n const nonLogicInputGuardBehavior = this.nonLogicInputGuardBehavior(state, pinStates, targetTick);\n if(nonLogicInputGuardBehavior) {\n return nonLogicInputGuardBehavior;\n }\n\n const input1High = pinStates.get('input1')!.hasVoltage;\n const input2High = pinStates.get('input2')!.hasVoltage;\n const oddParity = input1High !== input2High;\n\n const activationCondition =\n component.config.get('activationLogic') === 'negative' ? !oddParity : oddParity;\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * XOR4 Gate component behavior implementation (4 inputs)\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport type { ComponentState } from '../../states/ComponentState';\nimport { Xor4GateState } from '../../states/gates/Xor4GateState';\nimport {LogicGateBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\n/**\n * Behavior implementation for XOR4 Gate components (4 inputs).\n * With positive activationLogic: XOR gate (output high when odd number of inputs are high).\n * With negative activationLogic: XNOR gate (output high when even number of inputs are high).\n *\n * @public\n */\nexport class Xor4GateBehavior extends LogicGateBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.Xor4Gate);\n }\n\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for Xor4GateBehavior: ${component.type}`);\n }\n const state = component.config.get('activationLogic') === 'negative' ? 'high' : 'low';\n return new Xor4GateState(component.id, state);\n }\n\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n const vccGuardBehavior = this.vccGuardBehavior(state, pinStates, targetTick);\n if(vccGuardBehavior) {\n return vccGuardBehavior;\n }\n const nonLogicInputGuardBehavior = this.nonLogicInputGuardBehavior(state, pinStates, targetTick);\n if(nonLogicInputGuardBehavior) {\n return nonLogicInputGuardBehavior;\n }\n\n const highCount =\n (pinStates.get('input1')!.hasVoltage ? 1 : 0) +\n (pinStates.get('input2')!.hasVoltage ? 1 : 0) +\n (pinStates.get('input3')!.hasVoltage ? 1 : 0) +\n (pinStates.get('input4')!.hasVoltage ? 1 : 0);\n\n const oddParity = highCount % 2 === 1;\n\n const activationCondition =\n component.config.get('activationLogic') === 'negative' ? !oddParity : oddParity;\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * XOR8 Gate component behavior implementation (8 inputs)\n * @module core/simulation/behaviors\n */\n\nimport type { Component } from '../../../topology/Component';\nimport type { ComponentState } from '../../states/ComponentState';\nimport { Xor8GateState } from '../../states/gates/Xor8GateState';\nimport {LogicGateBehaviorMixin} from \"./index\";\nimport type {IBehaviorResult, IComponentBehavior} from \"../types\";\nimport type {INodeElectricalState} from \"../../states\";\nimport type {UUID} from \"../../../utils/types\";\nimport {ComponentType} from \"../../../topology/types\";\n\n/**\n * Behavior implementation for XOR8 Gate components (8 inputs).\n * With positive activationLogic: XOR gate (output high when odd number of inputs are high).\n * With negative activationLogic: XNOR gate (output high when even number of inputs are high).\n *\n * @public\n */\nexport class Xor8GateBehavior extends LogicGateBehaviorMixin implements IComponentBehavior {\n\n constructor() {\n super(ComponentType.Xor8Gate);\n }\n\n createInitialState(component: Component): ComponentState {\n if (component.type !== this._componentType) {\n throw new Error(`Invalid component type for Xor8GateBehavior: ${component.type}`);\n }\n const state = component.config.get('activationLogic') === 'negative' ? 'high' : 'low';\n return new Xor8GateState(component.id, state);\n }\n\n override onPinsChange(\n component: Component,\n state: ComponentState,\n nodeStates: ReadonlyMap<UUID, INodeElectricalState>,\n targetTick: number\n ): IBehaviorResult {\n const pinStates = this.getPinStates(component, nodeStates);\n const vccGuardBehavior = this.vccGuardBehavior(state, pinStates, targetTick);\n if(vccGuardBehavior) {\n return vccGuardBehavior;\n }\n const nonLogicInputGuardBehavior = this.nonLogicInputGuardBehavior(state, pinStates, targetTick);\n if(nonLogicInputGuardBehavior) {\n return nonLogicInputGuardBehavior;\n }\n\n const highCount =\n (pinStates.get('input1')!.hasVoltage ? 1 : 0) +\n (pinStates.get('input2')!.hasVoltage ? 1 : 0) +\n (pinStates.get('input3')!.hasVoltage ? 1 : 0) +\n (pinStates.get('input4')!.hasVoltage ? 1 : 0) +\n (pinStates.get('input5')!.hasVoltage ? 1 : 0) +\n (pinStates.get('input6')!.hasVoltage ? 1 : 0) +\n (pinStates.get('input7')!.hasVoltage ? 1 : 0) +\n (pinStates.get('input8')!.hasVoltage ? 1 : 0);\n\n const oddParity = highCount % 2 === 1;\n\n const activationCondition =\n component.config.get('activationLogic') === 'negative' ? !oddParity : oddParity;\n\n return this.getBehavior(component, state, activationCondition, targetTick);\n }\n}\n","/**\n * Core setup helper methods\n * @module core/setup\n */\n\nimport {\n BehaviorRegistry,\n BatteryBehavior,\n LightbulbBehavior,\n RectangleLEDBehavior,\n RelayBehavior,\n SmallLEDBehavior,\n SwitchBehavior,\n InverterBehavior,\n DoubleThrowSwitchBehavior,\n NandGateBehavior,\n Nand4GateBehavior,\n Nand8GateBehavior,\n NorGateBehavior,\n Nor4GateBehavior,\n Nor8GateBehavior,\n XorGateBehavior,\n Xor4GateBehavior,\n Xor8GateBehavior,\n} from './simulation/behaviors';\n\n/**\n * Register all basic component behaviors in the given registry\n * Basic components are : Battery, Lightbulb, RectangleLED, Relay, SmallLED, Switch, double switch\n * @public\n * @param registry\n * @return the input behavior registry for chaining\n */\nexport function registerBasicComponentsBehaviors(registry: BehaviorRegistry): BehaviorRegistry {\n registry\n .register(new BatteryBehavior())\n .register(new LightbulbBehavior())\n .register(new RectangleLEDBehavior())\n .register(new RelayBehavior())\n .register(new SmallLEDBehavior())\n .register(new SwitchBehavior())\n .register(new DoubleThrowSwitchBehavior());\n return registry;\n}\n\n/**\n * Register all gates component behaviors in the given registry\n * Gates components are : Inverter, NandGate (2,4,8), NorGate (2,4,8), XorGate (2,4,8)\n * @public\n * @param registry\n * @return the input behavior registry for chaining\n */\nexport function registerGatesComponentsBehaviors(registry: BehaviorRegistry): BehaviorRegistry {\n registry\n .register(new InverterBehavior())\n .register(new NandGateBehavior())\n .register(new Nand4GateBehavior())\n .register(new Nand8GateBehavior())\n .register(new NorGateBehavior())\n .register(new Nor4GateBehavior())\n .register(new Nor8GateBehavior())\n .register(new XorGateBehavior())\n .register(new Xor4GateBehavior())\n .register(new Xor8GateBehavior());\n return registry;\n}\n"],"names":["Memoize","args","hashFunction","duration","tags","_target","_propertyKey","descriptor","getNewFunction","MemoizeExpiring","expiring","clearCacheTagsMap","originalMethod","propMapName","returnedValue","myMap","tag","hashKey","a","timestampKey","isExpired","timestamp","Wire","node1","node2","intermediatePositions","generateUUID","p","json","positions","Position","wire","CircuitOptions","name","defaultLogicFamily","DEFAULT_LOGIC_FAMILY","CircuitMetadata","version","options","size","divisions","cameraOptions","CIRCUIT_FILE_VERSION","CameraOptions","TTL1_NAND","TTL1_AND","TTL1_NOR","TTL1_OR","computeTransitionSpan","component","logicFamily","isLogicGate","activationLogic","classif","classifyGate","computeGateDelay","type","ComponentType","componentType","gateFamily","inputCount","log2n","table","delay","Circuit","value","position","rotation","config","metadata","COMPONENT_TYPE_METADATA","Component","key","pins","pinLabel","pinMeta","pinNode","ENode","ENodeType","id","deletedWires","deletedENodes","pinId","enode","wireIds","wireId","result","sourceType","branchingPoint","wires","wire1","wire2","otherNode1","otherNode2","newWire","enode1","enode2","targetEnodeId","fullPositions","index","findPositionBestIndex","positionsWire1","positionsWire2","eNode","newWires","nodeId","componentId","pinIds","componentIds","enodeId","pinIndex","typeMetadata","pinLabels","label","simplify","simplifiedFullPositions","simplifyPositions","margin","maxPos","pos","c","w","finalMetadata","circuit","compData","enodeData","wireData","ComponentState","initialState","other","BatteryState","LightbulbState","SmallLEDState","RectangleLEDState","RelayState","SwitchState","DoubleThrowSwitchState","LogicGateState","InverterState","NandGateState","Nand4GateState","Nand8GateState","NorGateState","Nor4GateState","Nor8GateState","XorGateState","Xor4GateState","Xor8GateState","BehaviorRegistry","behavior","behaviors","ComponentBehaviorMixin","nodeStates","pinStates","_component","componentState","_nodeStates","_targetTick","_state","_conductivityType","_pinId","_otherPinId","state","_command","_event","BatteryBehavior","BipolarLightEmitterBehaviorMixin","activationCondition","targetTick","hasChanged","scheduledEvents","event","getTickCount","parameters","TRANSITION_DEFAULTS","LightbulbBehavior","RectangleLEDBehavior","getTransitionSpan","RelayBehavior","otherPinId","otherPinLabel","isCommanded","shouldBeClosed","transitionSpan","SmallLEDBehavior","SwitchBehavior","command","tickCount","DoubleThrowSwitchBehavior","LogicGateBehaviorMixin","shouldCancelPending","activateGuard","pinsMeta","pinState","InverterBehavior","vccGuardBehavior","nonLogicInputGuardBehavior","NandGateBehavior","allInputsHigh","Nand4GateBehavior","Nand8GateBehavior","NorGateBehavior","anyInputHigh","Nor4GateBehavior","Nor8GateBehavior","XorGateBehavior","input1High","input2High","oddParity","Xor4GateBehavior","Xor8GateBehavior","registerBasicComponentsBehaviors","registry","registerGatesComponentsBehaviors"],"mappings":"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"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}