Implemented some infrastructure for MPROMs
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Sat, 3 Oct 2020 16:45:33 +0000 (18:45 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Sat, 3 Oct 2020 20:49:21 +0000 (22:49 +0200)
17 files changed:
plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json
plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MPROM.java [new file with mode: 0644]
plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/AbstractAm2900MachineDefinition.java
plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MPROMDefinition.java [new file with mode: 0644]
plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java
plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json
plugins/net.mograsim.machine/src/net/mograsim/machine/Machine.java
plugins/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java
plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java
plugins/net.mograsim.machine/src/net/mograsim/machine/mi/AssignableMPROM.java [new file with mode: 0644]
plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MPROM.java [new file with mode: 0644]
plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MPROMDefinition.java [new file with mode: 0644]
plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMPROM.java [new file with mode: 0644]
plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMPROMDefinition.java [new file with mode: 0644]
plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMPROM.java [new file with mode: 0644]
plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/MPROMAdapter.java [new file with mode: 0644]
plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMPROM.java [new file with mode: 0644]

index b1c3127..cf75c6b 100644 (file)
@@ -5,6 +5,14 @@
   "innerScale": 0.4,
   "submodel": {
     "components": [
+      {
+        "id": "Am2900MPROM",
+        "name": "Am2900MPROM#0",
+        "pos": {
+          "x": 255.0,
+          "y": 385.0
+        }
+      },
       {
         "id": "Am2900MainMemory",
         "name": "Am2900MainMemory#0",
         },
         "params": "0"
       },
-      {
-        "id": "FixedOutput",
-        "name": "FixedOutput#7",
-        "pos": {
-          "x": 270.0,
-          "y": 380.0
-        },
-        "params": "0"
-      },
       {
         "id": "NandGate",
         "name": "NandGate#0",
       {
         "id": "Splitter",
         "name": "Splitter#3",
-        "pos": {
-          "x": 205.0,
-          "y": 390.0
-        },
-        "params": {
-          "logicWidth": 8,
-          "orientation": "DOWN"
-        }
-      },
-      {
-        "id": "Splitter",
-        "name": "Splitter#4",
-        "pos": {
-          "x": 205.0,
-          "y": 405.0
-        },
-        "params": {
-          "logicWidth": 12,
-          "orientation": "UP"
-        }
-      },
-      {
-        "id": "Splitter",
-        "name": "Splitter#5",
         "pos": {
           "x": 575.0,
           "y": 115.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#6",
+        "name": "Splitter#4",
         "pos": {
           "x": 575.0,
           "y": 195.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#7",
+        "name": "Splitter#5",
         "pos": {
           "x": 575.0,
           "y": 235.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#8",
+        "name": "Splitter#6",
         "pos": {
           "x": 675.0,
           "y": 150.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#9",
+        "name": "Splitter#7",
         "pos": {
           "x": 675.0,
           "y": 245.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#10",
+        "name": "Splitter#8",
         "pos": {
           "x": 345.0,
           "y": 830.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#11",
+        "name": "Splitter#9",
         "pos": {
           "x": 405.0,
           "y": 815.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#12",
+        "name": "Splitter#10",
         "pos": {
           "x": 525.0,
           "y": 815.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#13",
+        "name": "Splitter#11",
         "pos": {
           "x": 660.0,
           "y": 755.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#14",
+        "name": "Splitter#12",
         "pos": {
           "x": 575.0,
           "y": 815.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#15",
+        "name": "Splitter#13",
         "pos": {
           "x": 695.0,
           "y": 815.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#16",
+        "name": "Splitter#14",
         "pos": {
           "x": 655.0,
           "y": 815.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#17",
+        "name": "Splitter#15",
         "pos": {
           "x": 730.0,
           "y": 770.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#18",
+        "name": "Splitter#16",
         "pos": {
           "x": 690.0,
           "y": 770.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#19",
+        "name": "Splitter#17",
         "pos": {
           "x": 660.0,
           "y": 770.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#20",
+        "name": "Splitter#18",
         "pos": {
           "x": 925.0,
           "y": 815.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#21",
+        "name": "Splitter#19",
         "pos": {
           "x": 895.0,
           "y": 815.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#22",
+        "name": "Splitter#20",
         "pos": {
           "x": 865.0,
           "y": 815.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#23",
+        "name": "Splitter#21",
         "pos": {
           "x": 835.0,
           "y": 815.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#24",
+        "name": "Splitter#22",
         "pos": {
           "x": 795.0,
           "y": 815.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#25",
+        "name": "Splitter#23",
         "pos": {
           "x": 745.0,
           "y": 815.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#26",
+        "name": "Splitter#24",
         "pos": {
           "x": 895.0,
           "y": 800.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#27",
+        "name": "Splitter#25",
         "pos": {
           "x": 835.0,
           "y": 800.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#28",
+        "name": "Splitter#26",
         "pos": {
           "x": 865.0,
           "y": 800.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#29",
+        "name": "Splitter#27",
         "pos": {
           "x": 835.0,
           "y": 780.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#30",
+        "name": "Splitter#28",
         "pos": {
           "x": 895.0,
           "y": 330.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#31",
+        "name": "Splitter#29",
         "pos": {
           "x": 895.0,
           "y": 580.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#32",
+        "name": "Splitter#30",
         "pos": {
           "x": 895.0,
           "y": 565.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#33",
+        "name": "Splitter#31",
         "pos": {
           "x": 935.0,
           "y": 565.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#34",
+        "name": "Splitter#32",
         "pos": {
           "x": 975.0,
           "y": 565.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#35",
+        "name": "Splitter#33",
         "pos": {
           "x": 1015.0,
           "y": 565.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#36",
+        "name": "Splitter#34",
         "pos": {
           "x": 895.0,
           "y": 345.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#37",
+        "name": "Splitter#35",
         "pos": {
           "x": 935.0,
           "y": 345.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#38",
+        "name": "Splitter#36",
         "pos": {
           "x": 975.0,
           "y": 345.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#39",
+        "name": "Splitter#37",
         "pos": {
           "x": 1015.0,
           "y": 345.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#40",
+        "name": "Splitter#38",
         "pos": {
           "x": 310.0,
           "y": 235.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#41",
+        "name": "Splitter#39",
         "pos": {
           "x": 620.0,
           "y": 200.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#42",
+        "name": "Splitter#40",
         "pos": {
           "x": 365.0,
           "y": 815.0
       },
       {
         "id": "Splitter",
-        "name": "Splitter#43",
+        "name": "Splitter#41",
         "pos": {
           "x": 620.0,
           "y": 295.0
       {
         "id": "WireCrossPoint",
         "name": "WireCrossPoint#33",
-        "pos": {
-          "x": 284.0,
-          "y": 399.0
-        },
-        "params": 1
-      },
-      {
-        "id": "WireCrossPoint",
-        "name": "WireCrossPoint#34",
-        "pos": {
-          "x": 294.0,
-          "y": 399.0
-        },
-        "params": 1
-      },
-      {
-        "id": "WireCrossPoint",
-        "name": "WireCrossPoint#35",
-        "pos": {
-          "x": 304.0,
-          "y": 399.0
-        },
-        "params": 1
-      },
-      {
-        "id": "WireCrossPoint",
-        "name": "WireCrossPoint#36",
         "pos": {
           "x": 339.0,
           "y": 229.0
       },
       {
         "id": "WireCrossPoint",
-        "name": "WireCrossPoint#37",
+        "name": "WireCrossPoint#34",
         "pos": {
           "x": 824.0,
           "y": 699.0
       },
       {
         "id": "WireCrossPoint",
-        "name": "WireCrossPoint#38",
+        "name": "WireCrossPoint#35",
         "pos": {
           "x": 169.0,
           "y": 384.0
       },
       {
         "id": "WireCrossPoint",
-        "name": "WireCrossPoint#39",
+        "name": "WireCrossPoint#36",
         "pos": {
           "x": 179.0,
           "y": 364.0
       },
       {
         "id": "WireCrossPoint",
-        "name": "WireCrossPoint#40",
+        "name": "WireCrossPoint#37",
         "pos": {
           "x": 139.0,
           "y": 364.0
       },
       {
         "id": "WireCrossPoint",
-        "name": "WireCrossPoint#41",
+        "name": "WireCrossPoint#38",
         "pos": {
           "x": 139.0,
           "y": 379.0
       },
       {
         "id": "WireCrossPoint",
-        "name": "WireCrossPoint#42",
+        "name": "WireCrossPoint#39",
         "pos": {
           "x": 479.0,
           "y": 364.0
       },
       {
         "id": "WireCrossPoint",
-        "name": "WireCrossPoint#43",
+        "name": "WireCrossPoint#40",
         "pos": {
           "x": 239.0,
           "y": 564.0
       },
       {
         "id": "WireCrossPoint",
-        "name": "WireCrossPoint#44",
+        "name": "WireCrossPoint#41",
         "pos": {
           "x": 364.0,
           "y": 364.0
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#41",
+          "compName": "WireCrossPoint#38",
           "pinName": ""
         },
         "pin2": {
           "pinName": "O15"
         },
         "pin2": {
-          "compName": "Splitter#5",
+          "compName": "Splitter#3",
           "pinName": "O7"
         },
         "name": "unnamedWire#46",
       },
       {
         "pin1": {
-          "compName": "Splitter#5",
+          "compName": "Splitter#3",
           "pinName": "O6"
         },
         "pin2": {
           "pinName": "O13"
         },
         "pin2": {
-          "compName": "Splitter#5",
+          "compName": "Splitter#3",
           "pinName": "O5"
         },
         "name": "unnamedWire#48",
       },
       {
         "pin1": {
-          "compName": "Splitter#5",
+          "compName": "Splitter#3",
           "pinName": "O4"
         },
         "pin2": {
           "pinName": "O11"
         },
         "pin2": {
-          "compName": "Splitter#5",
+          "compName": "Splitter#3",
           "pinName": "O3"
         },
         "name": "unnamedWire#50",
           "pinName": "O10"
         },
         "pin2": {
-          "compName": "Splitter#5",
+          "compName": "Splitter#3",
           "pinName": "O2"
         },
         "name": "unnamedWire#51",
       },
       {
         "pin1": {
-          "compName": "Splitter#5",
+          "compName": "Splitter#3",
           "pinName": "O1"
         },
         "pin2": {
           "pinName": "O8"
         },
         "pin2": {
-          "compName": "Splitter#5",
+          "compName": "Splitter#3",
           "pinName": "O0"
         },
         "name": "unnamedWire#53",
           "pinName": ""
         },
         "pin2": {
-          "compName": "Splitter#6",
+          "compName": "Splitter#4",
           "pinName": "O3"
         },
         "name": "unnamedWire#55",
           "pinName": ""
         },
         "pin2": {
-          "compName": "Splitter#7",
+          "compName": "Splitter#5",
           "pinName": "O3"
         },
         "name": "unnamedWire#56",
       },
       {
         "pin1": {
-          "compName": "Splitter#7",
+          "compName": "Splitter#5",
           "pinName": "O2"
         },
         "pin2": {
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#7",
+          "compName": "Splitter#5",
           "pinName": "O1"
         },
         "name": "unnamedWire#58",
       },
       {
         "pin1": {
-          "compName": "Splitter#7",
+          "compName": "Splitter#5",
           "pinName": "O0"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#6",
+          "compName": "Splitter#4",
           "pinName": "O0"
         },
         "pin2": {
           "pinName": "O5"
         },
         "pin2": {
-          "compName": "Splitter#6",
+          "compName": "Splitter#4",
           "pinName": "O1"
         },
         "name": "unnamedWire#61",
       },
       {
         "pin1": {
-          "compName": "Splitter#6",
+          "compName": "Splitter#4",
           "pinName": "O2"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#7",
+          "compName": "Splitter#5",
           "pinName": "I"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#6",
+          "compName": "Splitter#4",
           "pinName": "I"
         },
         "pin2": {
           "pinName": "Y1"
         },
         "pin2": {
-          "compName": "Splitter#8",
+          "compName": "Splitter#6",
           "pinName": "O3"
         },
         "name": "unnamedWire#73",
       },
       {
         "pin1": {
-          "compName": "Splitter#8",
+          "compName": "Splitter#6",
           "pinName": "O2"
         },
         "pin2": {
           "pinName": "Y3"
         },
         "pin2": {
-          "compName": "Splitter#8",
+          "compName": "Splitter#6",
           "pinName": "O1"
         },
         "name": "unnamedWire#75",
       },
       {
         "pin1": {
-          "compName": "Splitter#8",
+          "compName": "Splitter#6",
           "pinName": "O0"
         },
         "pin2": {
           "pinName": "Y1"
         },
         "pin2": {
-          "compName": "Splitter#9",
+          "compName": "Splitter#7",
           "pinName": "O3"
         },
         "name": "unnamedWire#77",
       },
       {
         "pin1": {
-          "compName": "Splitter#9",
+          "compName": "Splitter#7",
           "pinName": "O2"
         },
         "pin2": {
           "pinName": "Y3"
         },
         "pin2": {
-          "compName": "Splitter#9",
+          "compName": "Splitter#7",
           "pinName": "O1"
         },
         "name": "unnamedWire#79",
       },
       {
         "pin1": {
-          "compName": "Splitter#9",
+          "compName": "Splitter#7",
           "pinName": "O0"
         },
         "pin2": {
           "pinName": ""
         },
         "pin2": {
-          "compName": "WireCrossPoint#42",
+          "compName": "WireCrossPoint#39",
           "pinName": ""
         },
         "name": "unnamedWire#93",
           "pinName": ""
         },
         "pin2": {
-          "compName": "WireCrossPoint#40",
+          "compName": "WireCrossPoint#37",
           "pinName": ""
         },
         "name": "unnamedWire#94",
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#40",
+          "compName": "WireCrossPoint#37",
           "pinName": ""
         },
         "pin2": {
-          "compName": "WireCrossPoint#39",
+          "compName": "WireCrossPoint#36",
           "pinName": ""
         },
         "name": "unnamedWire#95",
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#41",
+          "compName": "WireCrossPoint#38",
           "pinName": ""
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#40",
+          "compName": "WireCrossPoint#37",
           "pinName": ""
         },
         "pin2": {
-          "compName": "WireCrossPoint#41",
+          "compName": "WireCrossPoint#38",
           "pinName": ""
         },
         "name": "unnamedWire#97",
           "pinName": "Y"
         },
         "pin2": {
-          "compName": "WireCrossPoint#38",
+          "compName": "WireCrossPoint#35",
           "pinName": ""
         },
         "name": "unnamedWire#98",
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#38",
+          "compName": "WireCrossPoint#35",
           "pinName": ""
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#39",
+          "compName": "WireCrossPoint#36",
           "pinName": ""
         },
         "pin2": {
-          "compName": "WireCrossPoint#44",
+          "compName": "WireCrossPoint#41",
           "pinName": ""
         },
         "name": "unnamedWire#100",
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#39",
+          "compName": "WireCrossPoint#36",
           "pinName": ""
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#40",
+          "compName": "Splitter#38",
           "pinName": "O2"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#40",
+          "compName": "Splitter#38",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "WireCrossPoint#36",
+          "compName": "WireCrossPoint#33",
           "pinName": ""
         },
         "name": "unnamedWire#109",
       },
       {
         "pin1": {
-          "compName": "Splitter#8",
+          "compName": "Splitter#6",
           "pinName": "I"
         },
         "pin2": {
           "pinName": ""
         },
         "pin2": {
-          "compName": "Splitter#9",
+          "compName": "Splitter#7",
           "pinName": "I"
         },
         "name": "unnamedWire#114",
           "pinName": ""
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O37"
         },
         "name": "unnamedWire#119",
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#37",
+          "compName": "WireCrossPoint#34",
           "pinName": ""
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#40",
+          "compName": "Splitter#38",
           "pinName": "O3"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "FixedOutput#7",
-          "pinName": "out"
+          "compName": "Am2900MPROM#0",
+          "pinName": "D"
         },
         "pin2": {
-          "compName": "WireCrossPoint#33",
-          "pinName": ""
+          "compName": "mux1_12#0",
+          "pinName": "I0"
         },
         "name": "unnamedWire#133",
-        "path": [
-          {
-            "x": 285.0,
-            "y": 385.0
-          }
-        ]
+        "path": []
       },
       {
         "pin1": {
           "pinName": "Q"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "I"
         },
         "name": "unnamedWire#138",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O22"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#12",
+          "compName": "Splitter#10",
           "pinName": "O3"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O21"
         },
         "name": "unnamedWire#140",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O20"
         },
         "pin2": {
-          "compName": "Splitter#12",
+          "compName": "Splitter#10",
           "pinName": "O2"
         },
         "name": "unnamedWire#141",
       },
       {
         "pin1": {
-          "compName": "Splitter#12",
+          "compName": "Splitter#10",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O19"
         },
         "name": "unnamedWire#142",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O18"
         },
         "pin2": {
-          "compName": "Splitter#12",
+          "compName": "Splitter#10",
           "pinName": "O0"
         },
         "name": "unnamedWire#143",
       },
       {
         "pin1": {
-          "compName": "Splitter#12",
+          "compName": "Splitter#10",
           "pinName": "I"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "O11"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O17"
         },
         "name": "unnamedWire#145",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O16"
         },
         "pin2": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "O10"
         },
         "name": "unnamedWire#146",
       },
       {
         "pin1": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "O9"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O15"
         },
         "name": "unnamedWire#147",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O14"
         },
         "pin2": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "O8"
         },
         "name": "unnamedWire#148",
       },
       {
         "pin1": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "O7"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O13"
         },
         "name": "unnamedWire#149",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O12"
         },
         "pin2": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "O6"
         },
         "name": "unnamedWire#150",
       },
       {
         "pin1": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "O5"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O11"
         },
         "name": "unnamedWire#151",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O10"
         },
         "pin2": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "O4"
         },
         "name": "unnamedWire#152",
       },
       {
         "pin1": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "O3"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O9"
         },
         "name": "unnamedWire#153",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O8"
         },
         "pin2": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "O2"
         },
         "name": "unnamedWire#154",
       },
       {
         "pin1": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O7"
         },
         "name": "unnamedWire#155",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O6"
         },
         "pin2": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "O0"
         },
         "name": "unnamedWire#156",
           "pinName": "I1"
         },
         "pin2": {
-          "compName": "Splitter#11",
+          "compName": "Splitter#9",
           "pinName": "I"
         },
         "name": "unnamedWire#158",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O5"
         },
         "pin2": {
-          "compName": "Splitter#42",
+          "compName": "Splitter#40",
           "pinName": "O3"
         },
         "name": "unnamedWire#161",
       },
       {
         "pin1": {
-          "compName": "Splitter#40",
+          "compName": "Splitter#38",
           "pinName": "I"
         },
         "pin2": {
-          "compName": "Splitter#42",
+          "compName": "Splitter#40",
           "pinName": "I"
         },
         "name": "unnamedWire#162",
           "pinName": "A"
         },
         "pin2": {
-          "compName": "WireCrossPoint#43",
+          "compName": "WireCrossPoint#40",
           "pinName": ""
         },
         "name": "unnamedWire#163",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O29"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O30"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#14",
+          "compName": "Splitter#12",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O23"
         },
         "name": "unnamedWire#166",
       },
       {
         "pin1": {
-          "compName": "Splitter#14",
+          "compName": "Splitter#12",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O25"
         },
         "name": "unnamedWire#167",
       },
       {
         "pin1": {
-          "compName": "Splitter#14",
+          "compName": "Splitter#12",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O24"
         },
         "name": "unnamedWire#168",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O26"
         },
         "pin2": {
-          "compName": "Splitter#14",
+          "compName": "Splitter#12",
           "pinName": "O3"
         },
         "name": "unnamedWire#169",
       },
       {
         "pin1": {
-          "compName": "Splitter#14",
+          "compName": "Splitter#12",
           "pinName": "O4"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O27"
         },
         "name": "unnamedWire#170",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O28"
         },
         "pin2": {
-          "compName": "Splitter#14",
+          "compName": "Splitter#12",
           "pinName": "O5"
         },
         "name": "unnamedWire#171",
       },
       {
         "pin1": {
-          "compName": "Splitter#16",
+          "compName": "Splitter#14",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O31"
         },
         "name": "unnamedWire#172",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O32"
         },
         "pin2": {
-          "compName": "Splitter#16",
+          "compName": "Splitter#14",
           "pinName": "O1"
         },
         "name": "unnamedWire#173",
       },
       {
         "pin1": {
-          "compName": "Splitter#16",
+          "compName": "Splitter#14",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O33"
         },
         "name": "unnamedWire#174",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O34"
         },
         "pin2": {
-          "compName": "Splitter#16",
+          "compName": "Splitter#14",
           "pinName": "O3"
         },
         "name": "unnamedWire#175",
       },
       {
         "pin1": {
-          "compName": "Splitter#15",
+          "compName": "Splitter#13",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O35"
         },
         "name": "unnamedWire#176",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O36"
         },
         "pin2": {
-          "compName": "Splitter#15",
+          "compName": "Splitter#13",
           "pinName": "O1"
         },
         "name": "unnamedWire#177",
       },
       {
         "pin1": {
-          "compName": "Splitter#17",
+          "compName": "Splitter#15",
           "pinName": "I"
         },
         "pin2": {
-          "compName": "Splitter#14",
+          "compName": "Splitter#12",
           "pinName": "I"
         },
         "name": "unnamedWire#178",
       },
       {
         "pin1": {
-          "compName": "Splitter#16",
+          "compName": "Splitter#14",
           "pinName": "I"
         },
         "pin2": {
-          "compName": "Splitter#18",
+          "compName": "Splitter#16",
           "pinName": "I"
         },
         "name": "unnamedWire#179",
       },
       {
         "pin1": {
-          "compName": "Splitter#19",
+          "compName": "Splitter#17",
           "pinName": "I"
         },
         "pin2": {
-          "compName": "Splitter#15",
+          "compName": "Splitter#13",
           "pinName": "I"
         },
         "name": "unnamedWire#180",
       },
       {
         "pin1": {
-          "compName": "Splitter#17",
+          "compName": "Splitter#15",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O0"
         },
         "name": "unnamedWire#181",
       },
       {
         "pin1": {
-          "compName": "Splitter#17",
+          "compName": "Splitter#15",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O1"
         },
         "name": "unnamedWire#182",
       },
       {
         "pin1": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#17",
+          "compName": "Splitter#15",
           "pinName": "O2"
         },
         "name": "unnamedWire#183",
       },
       {
         "pin1": {
-          "compName": "Splitter#17",
+          "compName": "Splitter#15",
           "pinName": "O3"
         },
         "pin2": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O3"
         },
         "name": "unnamedWire#184",
       },
       {
         "pin1": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O4"
         },
         "pin2": {
-          "compName": "Splitter#17",
+          "compName": "Splitter#15",
           "pinName": "O4"
         },
         "name": "unnamedWire#185",
       },
       {
         "pin1": {
-          "compName": "Splitter#17",
+          "compName": "Splitter#15",
           "pinName": "O5"
         },
         "pin2": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O5"
         },
         "name": "unnamedWire#186",
       },
       {
         "pin1": {
-          "compName": "Splitter#18",
+          "compName": "Splitter#16",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O6"
         },
         "name": "unnamedWire#187",
       },
       {
         "pin1": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O7"
         },
         "pin2": {
-          "compName": "Splitter#18",
+          "compName": "Splitter#16",
           "pinName": "O1"
         },
         "name": "unnamedWire#188",
       },
       {
         "pin1": {
-          "compName": "Splitter#18",
+          "compName": "Splitter#16",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O8"
         },
         "name": "unnamedWire#189",
       },
       {
         "pin1": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O9"
         },
         "pin2": {
-          "compName": "Splitter#18",
+          "compName": "Splitter#16",
           "pinName": "O3"
         },
         "name": "unnamedWire#190",
       },
       {
         "pin1": {
-          "compName": "Splitter#19",
+          "compName": "Splitter#17",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O11"
         },
         "name": "unnamedWire#191",
       },
       {
         "pin1": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O12"
         },
         "pin2": {
-          "compName": "Splitter#19",
+          "compName": "Splitter#17",
           "pinName": "O1"
         },
         "name": "unnamedWire#192",
       },
       {
         "pin1": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O15"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O73"
         },
         "name": "unnamedWire#193",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O72"
         },
         "pin2": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O14"
         },
         "name": "unnamedWire#194",
       },
       {
         "pin1": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O13"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O71"
         },
         "name": "unnamedWire#195",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O70"
         },
         "pin2": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O12"
         },
         "name": "unnamedWire#196",
       },
       {
         "pin1": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O11"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O69"
         },
         "name": "unnamedWire#197",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O68"
         },
         "pin2": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O10"
         },
         "name": "unnamedWire#198",
       },
       {
         "pin1": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O9"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O67"
         },
         "name": "unnamedWire#199",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O66"
         },
         "pin2": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O8"
         },
         "name": "unnamedWire#200",
       },
       {
         "pin1": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O7"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O65"
         },
         "name": "unnamedWire#201",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O64"
         },
         "pin2": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O6"
         },
         "name": "unnamedWire#202",
       },
       {
         "pin1": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O5"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O63"
         },
         "name": "unnamedWire#203",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O62"
         },
         "pin2": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O4"
         },
         "name": "unnamedWire#204",
       },
       {
         "pin1": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O3"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O61"
         },
         "name": "unnamedWire#205",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O60"
         },
         "pin2": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O2"
         },
         "name": "unnamedWire#206",
       },
       {
         "pin1": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O59"
         },
         "name": "unnamedWire#207",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O58"
         },
         "pin2": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "O0"
         },
         "name": "unnamedWire#208",
       },
       {
         "pin1": {
-          "compName": "Splitter#21",
+          "compName": "Splitter#19",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O57"
         },
         "name": "unnamedWire#209",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O56"
         },
         "pin2": {
-          "compName": "Splitter#21",
+          "compName": "Splitter#19",
           "pinName": "O1"
         },
         "name": "unnamedWire#210",
       },
       {
         "pin1": {
-          "compName": "Splitter#21",
+          "compName": "Splitter#19",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O55"
         },
         "name": "unnamedWire#211",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O54"
         },
         "pin2": {
-          "compName": "Splitter#22",
+          "compName": "Splitter#20",
           "pinName": "O2"
         },
         "name": "unnamedWire#212",
       },
       {
         "pin1": {
-          "compName": "Splitter#22",
+          "compName": "Splitter#20",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O53"
         },
         "name": "unnamedWire#213",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O52"
         },
         "pin2": {
-          "compName": "Splitter#22",
+          "compName": "Splitter#20",
           "pinName": "O0"
         },
         "name": "unnamedWire#214",
       },
       {
         "pin1": {
-          "compName": "Splitter#23",
+          "compName": "Splitter#21",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O51"
         },
         "name": "unnamedWire#215",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O50"
         },
         "pin2": {
-          "compName": "Splitter#23",
+          "compName": "Splitter#21",
           "pinName": "O1"
         },
         "name": "unnamedWire#216",
       },
       {
         "pin1": {
-          "compName": "Splitter#23",
+          "compName": "Splitter#21",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O49"
         },
         "name": "unnamedWire#217",
       },
       {
         "pin1": {
-          "compName": "Splitter#24",
+          "compName": "Splitter#22",
           "pinName": "O3"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O48"
         },
         "name": "unnamedWire#218",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O47"
         },
         "pin2": {
-          "compName": "Splitter#24",
+          "compName": "Splitter#22",
           "pinName": "O2"
         },
         "name": "unnamedWire#219",
       },
       {
         "pin1": {
-          "compName": "Splitter#24",
+          "compName": "Splitter#22",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O46"
         },
         "name": "unnamedWire#220",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O45"
         },
         "pin2": {
-          "compName": "Splitter#24",
+          "compName": "Splitter#22",
           "pinName": "O0"
         },
         "name": "unnamedWire#221",
       },
       {
         "pin1": {
-          "compName": "Splitter#25",
+          "compName": "Splitter#23",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O40"
         },
         "name": "unnamedWire#222",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O41"
         },
         "pin2": {
-          "compName": "Splitter#25",
+          "compName": "Splitter#23",
           "pinName": "O1"
         },
         "name": "unnamedWire#223",
       },
       {
         "pin1": {
-          "compName": "Splitter#25",
+          "compName": "Splitter#23",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O42"
         },
         "name": "unnamedWire#224",
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O43"
         },
         "pin2": {
-          "compName": "Splitter#25",
+          "compName": "Splitter#23",
           "pinName": "O3"
         },
         "name": "unnamedWire#225",
           "pinName": ""
         },
         "pin2": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "O10"
         },
         "name": "unnamedWire#226",
       },
       {
         "pin1": {
-          "compName": "Splitter#27",
+          "compName": "Splitter#25",
           "pinName": "I"
         },
         "pin2": {
-          "compName": "Splitter#23",
+          "compName": "Splitter#21",
           "pinName": "I"
         },
         "name": "unnamedWire#227",
       },
       {
         "pin1": {
-          "compName": "Splitter#28",
+          "compName": "Splitter#26",
           "pinName": "I"
         },
         "pin2": {
-          "compName": "Splitter#22",
+          "compName": "Splitter#20",
           "pinName": "I"
         },
         "name": "unnamedWire#228",
       },
       {
         "pin1": {
-          "compName": "Splitter#26",
+          "compName": "Splitter#24",
           "pinName": "I"
         },
         "pin2": {
-          "compName": "Splitter#21",
+          "compName": "Splitter#19",
           "pinName": "I"
         },
         "name": "unnamedWire#229",
       },
       {
         "pin1": {
-          "compName": "Splitter#29",
+          "compName": "Splitter#27",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#26",
+          "compName": "Splitter#24",
           "pinName": "O0"
         },
         "name": "unnamedWire#230",
       },
       {
         "pin1": {
-          "compName": "Splitter#26",
+          "compName": "Splitter#24",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#29",
+          "compName": "Splitter#27",
           "pinName": "O1"
         },
         "name": "unnamedWire#231",
       },
       {
         "pin1": {
-          "compName": "Splitter#29",
+          "compName": "Splitter#27",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#26",
+          "compName": "Splitter#24",
           "pinName": "O2"
         },
         "name": "unnamedWire#232",
       },
       {
         "pin1": {
-          "compName": "Splitter#28",
+          "compName": "Splitter#26",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#29",
+          "compName": "Splitter#27",
           "pinName": "O3"
         },
         "name": "unnamedWire#233",
       },
       {
         "pin1": {
-          "compName": "Splitter#29",
+          "compName": "Splitter#27",
           "pinName": "O4"
         },
         "pin2": {
-          "compName": "Splitter#28",
+          "compName": "Splitter#26",
           "pinName": "O1"
         },
         "name": "unnamedWire#234",
       },
       {
         "pin1": {
-          "compName": "Splitter#29",
+          "compName": "Splitter#27",
           "pinName": "O5"
         },
         "pin2": {
-          "compName": "Splitter#28",
+          "compName": "Splitter#26",
           "pinName": "O2"
         },
         "name": "unnamedWire#235",
       },
       {
         "pin1": {
-          "compName": "Splitter#29",
+          "compName": "Splitter#27",
           "pinName": "O6"
         },
         "pin2": {
-          "compName": "Splitter#27",
+          "compName": "Splitter#25",
           "pinName": "O0"
         },
         "name": "unnamedWire#236",
       },
       {
         "pin1": {
-          "compName": "Splitter#27",
+          "compName": "Splitter#25",
           "pinName": "O1"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#29",
+          "compName": "Splitter#27",
           "pinName": "O8"
         },
         "pin2": {
-          "compName": "Splitter#27",
+          "compName": "Splitter#25",
           "pinName": "O2"
         },
         "name": "unnamedWire#238",
           "pinName": ""
         },
         "pin2": {
-          "compName": "Splitter#29",
+          "compName": "Splitter#27",
           "pinName": "O7"
         },
         "name": "unnamedWire#239",
       },
       {
         "pin1": {
-          "compName": "Splitter#13",
+          "compName": "Splitter#11",
           "pinName": "I"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O0"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#5",
+          "compName": "Splitter#3",
           "pinName": "I"
         },
         "pin2": {
-          "compName": "Splitter#3",
-          "pinName": "I"
+          "compName": "Am2900MPROM#0",
+          "pinName": "A"
         },
         "name": "unnamedWire#242",
         "path": [
           },
           {
             "x": 590.0,
-            "y": 335.0
+            "y": 290.0
           },
           {
-            "x": 240.0,
-            "y": 335.0
+            "x": 290.0,
+            "y": 290.0
+          },
+          {
+            "x": 290.0,
+            "y": 415.0
           }
         ]
       },
       {
         "pin1": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O15"
         },
         "pin2": {
-          "compName": "Splitter#36",
+          "compName": "Splitter#34",
           "pinName": "O3"
         },
         "name": "unnamedWire#243",
       },
       {
         "pin1": {
-          "compName": "Splitter#36",
+          "compName": "Splitter#34",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O14"
         },
         "name": "unnamedWire#244",
       },
       {
         "pin1": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O13"
         },
         "pin2": {
-          "compName": "Splitter#36",
+          "compName": "Splitter#34",
           "pinName": "O1"
         },
         "name": "unnamedWire#245",
       },
       {
         "pin1": {
-          "compName": "Splitter#36",
+          "compName": "Splitter#34",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O12"
         },
         "name": "unnamedWire#246",
       },
       {
         "pin1": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O11"
         },
         "pin2": {
-          "compName": "Splitter#37",
+          "compName": "Splitter#35",
           "pinName": "O3"
         },
         "name": "unnamedWire#247",
       },
       {
         "pin1": {
-          "compName": "Splitter#37",
+          "compName": "Splitter#35",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O10"
         },
         "name": "unnamedWire#248",
       },
       {
         "pin1": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O9"
         },
         "pin2": {
-          "compName": "Splitter#37",
+          "compName": "Splitter#35",
           "pinName": "O1"
         },
         "name": "unnamedWire#249",
       },
       {
         "pin1": {
-          "compName": "Splitter#37",
+          "compName": "Splitter#35",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O8"
         },
         "name": "unnamedWire#250",
       },
       {
         "pin1": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O7"
         },
         "pin2": {
-          "compName": "Splitter#38",
+          "compName": "Splitter#36",
           "pinName": "O3"
         },
         "name": "unnamedWire#251",
       },
       {
         "pin1": {
-          "compName": "Splitter#38",
+          "compName": "Splitter#36",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O6"
         },
         "name": "unnamedWire#252",
       },
       {
         "pin1": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O5"
         },
         "pin2": {
-          "compName": "Splitter#38",
+          "compName": "Splitter#36",
           "pinName": "O1"
         },
         "name": "unnamedWire#253",
       },
       {
         "pin1": {
-          "compName": "Splitter#38",
+          "compName": "Splitter#36",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O4"
         },
         "name": "unnamedWire#254",
       },
       {
         "pin1": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O3"
         },
         "pin2": {
-          "compName": "Splitter#39",
+          "compName": "Splitter#37",
           "pinName": "O3"
         },
         "name": "unnamedWire#255",
       },
       {
         "pin1": {
-          "compName": "Splitter#39",
+          "compName": "Splitter#37",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O2"
         },
         "name": "unnamedWire#256",
       },
       {
         "pin1": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#39",
+          "compName": "Splitter#37",
           "pinName": "O1"
         },
         "name": "unnamedWire#257",
       },
       {
         "pin1": {
-          "compName": "Splitter#39",
+          "compName": "Splitter#37",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "O0"
         },
         "name": "unnamedWire#258",
       },
       {
         "pin1": {
-          "compName": "Splitter#32",
+          "compName": "Splitter#30",
           "pinName": "O3"
         },
         "pin2": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O15"
         },
         "name": "unnamedWire#259",
       },
       {
         "pin1": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O14"
         },
         "pin2": {
-          "compName": "Splitter#32",
+          "compName": "Splitter#30",
           "pinName": "O2"
         },
         "name": "unnamedWire#260",
       },
       {
         "pin1": {
-          "compName": "Splitter#32",
+          "compName": "Splitter#30",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O13"
         },
         "name": "unnamedWire#261",
       },
       {
         "pin1": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O12"
         },
         "pin2": {
-          "compName": "Splitter#32",
+          "compName": "Splitter#30",
           "pinName": "O0"
         },
         "name": "unnamedWire#262",
       },
       {
         "pin1": {
-          "compName": "Splitter#33",
+          "compName": "Splitter#31",
           "pinName": "O3"
         },
         "pin2": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O11"
         },
         "name": "unnamedWire#263",
       },
       {
         "pin1": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O10"
         },
         "pin2": {
-          "compName": "Splitter#33",
+          "compName": "Splitter#31",
           "pinName": "O2"
         },
         "name": "unnamedWire#264",
       },
       {
         "pin1": {
-          "compName": "Splitter#33",
+          "compName": "Splitter#31",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O9"
         },
         "name": "unnamedWire#265",
       },
       {
         "pin1": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O8"
         },
         "pin2": {
-          "compName": "Splitter#33",
+          "compName": "Splitter#31",
           "pinName": "O0"
         },
         "name": "unnamedWire#266",
       },
       {
         "pin1": {
-          "compName": "Splitter#34",
+          "compName": "Splitter#32",
           "pinName": "O3"
         },
         "pin2": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O7"
         },
         "name": "unnamedWire#267",
       },
       {
         "pin1": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O6"
         },
         "pin2": {
-          "compName": "Splitter#34",
+          "compName": "Splitter#32",
           "pinName": "O2"
         },
         "name": "unnamedWire#268",
       },
       {
         "pin1": {
-          "compName": "Splitter#34",
+          "compName": "Splitter#32",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O5"
         },
         "name": "unnamedWire#269",
       },
       {
         "pin1": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O4"
         },
         "pin2": {
-          "compName": "Splitter#34",
+          "compName": "Splitter#32",
           "pinName": "O0"
         },
         "name": "unnamedWire#270",
       },
       {
         "pin1": {
-          "compName": "Splitter#35",
+          "compName": "Splitter#33",
           "pinName": "O3"
         },
         "pin2": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O3"
         },
         "name": "unnamedWire#271",
       },
       {
         "pin1": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#35",
+          "compName": "Splitter#33",
           "pinName": "O2"
         },
         "name": "unnamedWire#272",
       },
       {
         "pin1": {
-          "compName": "Splitter#35",
+          "compName": "Splitter#33",
           "pinName": "O1"
         },
         "pin2": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O1"
         },
         "name": "unnamedWire#273",
       },
       {
         "pin1": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#35",
+          "compName": "Splitter#33",
           "pinName": "O0"
         },
         "name": "unnamedWire#274",
           "pinName": "Y"
         },
         "pin2": {
-          "compName": "Splitter#30",
+          "compName": "Splitter#28",
           "pinName": "I"
         },
         "name": "unnamedWire#275",
           "pinName": "S"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O74"
         },
         "name": "unnamedWire#276",
       },
       {
         "pin1": {
-          "compName": "Splitter#20",
+          "compName": "Splitter#18",
           "pinName": "I"
         },
         "pin2": {
       },
       {
         "pin1": {
-          "compName": "Splitter#31",
+          "compName": "Splitter#29",
           "pinName": "I"
         },
         "pin2": {
         "name": "unnamedWire#283",
         "path": []
       },
-      {
-        "pin1": {
-          "compName": "WireCrossPoint#33",
-          "pinName": ""
-        },
-        "pin2": {
-          "compName": "WireCrossPoint#34",
-          "pinName": ""
-        },
-        "name": "unnamedWire#284",
-        "path": []
-      },
       {
         "pin1": {
           "compName": "WireCrossPoint#19",
           "compName": "WireCrossPoint#23",
           "pinName": ""
         },
-        "name": "unnamedWire#285",
-        "path": []
-      },
-      {
-        "pin1": {
-          "compName": "WireCrossPoint#34",
-          "pinName": ""
-        },
-        "pin2": {
-          "compName": "WireCrossPoint#35",
-          "pinName": ""
-        },
-        "name": "unnamedWire#286",
+        "name": "unnamedWire#284",
         "path": []
       },
       {
           "compName": "WireCrossPoint#22",
           "pinName": ""
         },
-        "name": "unnamedWire#287",
+        "name": "unnamedWire#285",
         "path": [
           {
             "x": 450.0,
           "compName": "TriStateBuffer#3",
           "pinName": "OUT"
         },
-        "name": "unnamedWire#288",
+        "name": "unnamedWire#286",
         "path": [
           {
             "x": 455.0,
           "compName": "dff16_invwe#0",
           "pinName": "D"
         },
-        "name": "unnamedWire#289",
+        "name": "unnamedWire#287",
         "path": [
           {
             "x": 475.0,
       },
       {
         "pin1": {
-          "compName": "Splitter#40",
+          "compName": "Splitter#38",
           "pinName": "O1"
         },
         "pin2": {
           "compName": "WireCrossPoint#12",
           "pinName": ""
         },
-        "name": "unnamedWire#290",
+        "name": "unnamedWire#288",
         "path": []
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O1"
         },
         "pin2": {
           "compName": "dff16_invwe#0",
           "pinName": "_WE"
         },
-        "name": "unnamedWire#291",
+        "name": "unnamedWire#289",
         "path": [
           {
             "x": 355.0,
             "y": 320.0
           },
           {
-            "x": 485.0,
-            "y": 185.0
-          }
-        ]
-      },
-      {
-        "pin1": {
-          "compName": "WireCrossPoint#35",
-          "pinName": ""
-        },
-        "pin2": {
-          "compName": "Splitter#4",
-          "pinName": "O0"
-        },
-        "name": "unnamedWire#292",
-        "path": [
-          {
-            "x": 315.0,
-            "y": 400.0
-          }
-        ]
-      },
-      {
-        "pin1": {
-          "compName": "WireCrossPoint#35",
-          "pinName": ""
-        },
-        "pin2": {
-          "compName": "Splitter#4",
-          "pinName": "O1"
-        },
-        "name": "unnamedWire#293",
-        "path": []
-      },
-      {
-        "pin1": {
-          "compName": "WireCrossPoint#34",
-          "pinName": ""
-        },
-        "pin2": {
-          "compName": "Splitter#4",
-          "pinName": "O2"
-        },
-        "name": "unnamedWire#294",
-        "path": []
-      },
-      {
-        "pin1": {
-          "compName": "WireCrossPoint#33",
-          "pinName": ""
-        },
-        "pin2": {
-          "compName": "Splitter#4",
-          "pinName": "O3"
-        },
-        "name": "unnamedWire#295",
-        "path": []
-      },
-      {
-        "pin1": {
-          "compName": "Splitter#42",
-          "pinName": "O2"
-        },
-        "pin2": {
-          "compName": "Splitter#10",
-          "pinName": "O4"
-        },
-        "name": "unnamedWire#296",
-        "path": []
-      },
-      {
-        "pin1": {
-          "compName": "Splitter#10",
-          "pinName": "O3"
-        },
-        "pin2": {
-          "compName": "Splitter#42",
-          "pinName": "O1"
-        },
-        "name": "unnamedWire#297",
-        "path": []
-      },
-      {
-        "pin1": {
-          "compName": "Splitter#42",
-          "pinName": "O0"
-        },
-        "pin2": {
-          "compName": "Splitter#10",
-          "pinName": "O2"
-        },
-        "name": "unnamedWire#298",
-        "path": []
+            "x": 485.0,
+            "y": 185.0
+          }
+        ]
       },
       {
         "pin1": {
-          "compName": "Splitter#3",
-          "pinName": "O7"
+          "compName": "Splitter#40",
+          "pinName": "O2"
         },
         "pin2": {
-          "compName": "Splitter#4",
-          "pinName": "O11"
+          "compName": "Splitter#8",
+          "pinName": "O4"
         },
-        "name": "unnamedWire#299",
+        "name": "unnamedWire#290",
         "path": []
       },
       {
         "pin1": {
-          "compName": "Splitter#3",
-          "pinName": "O6"
+          "compName": "Splitter#8",
+          "pinName": "O3"
         },
         "pin2": {
-          "compName": "Splitter#4",
-          "pinName": "O10"
+          "compName": "Splitter#40",
+          "pinName": "O1"
         },
-        "name": "unnamedWire#300",
+        "name": "unnamedWire#291",
         "path": []
       },
       {
         "pin1": {
-          "compName": "Splitter#3",
-          "pinName": "O5"
+          "compName": "Splitter#40",
+          "pinName": "O0"
         },
         "pin2": {
-          "compName": "Splitter#4",
-          "pinName": "O9"
+          "compName": "Splitter#8",
+          "pinName": "O2"
         },
-        "name": "unnamedWire#301",
+        "name": "unnamedWire#292",
         "path": []
       },
       {
         "pin1": {
-          "compName": "Splitter#41",
+          "compName": "Splitter#39",
           "pinName": "O3"
         },
         "pin2": {
           "compName": "mux1_4#0",
           "pinName": "I1_1"
         },
-        "name": "unnamedWire#302",
+        "name": "unnamedWire#293",
         "path": []
       },
       {
           "pinName": "I1_2"
         },
         "pin2": {
-          "compName": "Splitter#41",
+          "compName": "Splitter#39",
           "pinName": "O2"
         },
-        "name": "unnamedWire#303",
+        "name": "unnamedWire#294",
         "path": []
       },
       {
         "pin1": {
-          "compName": "Splitter#41",
+          "compName": "Splitter#39",
           "pinName": "O1"
         },
         "pin2": {
           "compName": "mux1_4#0",
           "pinName": "I1_3"
         },
-        "name": "unnamedWire#304",
+        "name": "unnamedWire#295",
         "path": []
       },
       {
           "pinName": "I1_4"
         },
         "pin2": {
-          "compName": "Splitter#41",
+          "compName": "Splitter#39",
           "pinName": "O0"
         },
-        "name": "unnamedWire#305",
+        "name": "unnamedWire#296",
         "path": []
       },
       {
         "pin1": {
-          "compName": "Splitter#43",
+          "compName": "Splitter#41",
           "pinName": "O3"
         },
         "pin2": {
           "compName": "mux1_4#1",
           "pinName": "I1_1"
         },
-        "name": "unnamedWire#306",
+        "name": "unnamedWire#297",
         "path": []
       },
       {
           "pinName": "I1_2"
         },
         "pin2": {
-          "compName": "Splitter#43",
+          "compName": "Splitter#41",
           "pinName": "O2"
         },
-        "name": "unnamedWire#307",
+        "name": "unnamedWire#298",
         "path": []
       },
       {
         "pin1": {
-          "compName": "Splitter#43",
+          "compName": "Splitter#41",
           "pinName": "O1"
         },
         "pin2": {
           "compName": "mux1_4#1",
           "pinName": "I1_3"
         },
-        "name": "unnamedWire#308",
+        "name": "unnamedWire#299",
         "path": []
       },
       {
           "pinName": "I1_4"
         },
         "pin2": {
-          "compName": "Splitter#43",
+          "compName": "Splitter#41",
           "pinName": "O0"
         },
-        "name": "unnamedWire#309",
+        "name": "unnamedWire#300",
         "path": []
       },
       {
         "pin1": {
-          "compName": "Splitter#41",
+          "compName": "Splitter#39",
           "pinName": "I"
         },
         "pin2": {
-          "compName": "Splitter#24",
+          "compName": "Splitter#22",
           "pinName": "I"
         },
-        "name": "unnamedWire#310",
+        "name": "unnamedWire#301",
         "path": [
           {
             "x": 600.0,
       },
       {
         "pin1": {
-          "compName": "Splitter#25",
+          "compName": "Splitter#23",
           "pinName": "I"
         },
         "pin2": {
-          "compName": "Splitter#43",
+          "compName": "Splitter#41",
           "pinName": "I"
         },
-        "name": "unnamedWire#311",
+        "name": "unnamedWire#302",
         "path": [
           {
             "x": 760.0,
           "pinName": "S0"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O44"
         },
-        "name": "unnamedWire#312",
+        "name": "unnamedWire#303",
         "path": [
           {
             "x": 605.0,
           "pinName": "S0"
         },
         "pin2": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O39"
         },
-        "name": "unnamedWire#313",
+        "name": "unnamedWire#304",
         "path": [
           {
             "x": 615.0,
           "pinName": ""
         },
         "pin2": {
-          "compName": "Splitter#29",
+          "compName": "Splitter#27",
           "pinName": "I"
         },
-        "name": "unnamedWire#314",
+        "name": "unnamedWire#305",
         "path": [
           {
             "x": 820.0,
           "compName": "WireCrossPoint#27",
           "pinName": ""
         },
-        "name": "unnamedWire#315",
+        "name": "unnamedWire#306",
         "path": []
       },
       {
           "compName": "WireCrossPoint#28",
           "pinName": ""
         },
-        "name": "unnamedWire#316",
+        "name": "unnamedWire#307",
         "path": []
       },
       {
           "compName": "Am2901#0",
           "pinName": "I"
         },
-        "name": "unnamedWire#317",
+        "name": "unnamedWire#308",
         "path": [
           {
             "x": 820.0,
           "compName": "Am2901#1",
           "pinName": "I"
         },
-        "name": "unnamedWire#318",
+        "name": "unnamedWire#309",
         "path": [
           {
             "x": 945.0,
           "compName": "Am2901#2",
           "pinName": "I"
         },
-        "name": "unnamedWire#319",
+        "name": "unnamedWire#310",
         "path": [
           {
             "x": 1070.0,
           "compName": "Am2901#3",
           "pinName": "I"
         },
-        "name": "unnamedWire#320",
+        "name": "unnamedWire#311",
         "path": [
           {
             "x": 1205.0,
       },
       {
         "pin1": {
-          "compName": "Splitter#32",
+          "compName": "Splitter#30",
           "pinName": "I"
         },
         "pin2": {
           "compName": "Am2901#3",
           "pinName": "Y"
         },
-        "name": "unnamedWire#321",
+        "name": "unnamedWire#312",
         "path": [
           {
             "x": 910.0,
       },
       {
         "pin1": {
-          "compName": "Splitter#33",
+          "compName": "Splitter#31",
           "pinName": "I"
         },
         "pin2": {
           "compName": "Am2901#2",
           "pinName": "Y"
         },
-        "name": "unnamedWire#322",
+        "name": "unnamedWire#313",
         "path": [
           {
             "x": 950.0,
       },
       {
         "pin1": {
-          "compName": "Splitter#34",
+          "compName": "Splitter#32",
           "pinName": "I"
         },
         "pin2": {
           "compName": "Am2901#1",
           "pinName": "Y"
         },
-        "name": "unnamedWire#323",
+        "name": "unnamedWire#314",
         "path": [
           {
             "x": 990.0,
           "pinName": "Y"
         },
         "pin2": {
-          "compName": "Splitter#35",
+          "compName": "Splitter#33",
           "pinName": "I"
         },
-        "name": "unnamedWire#324",
+        "name": "unnamedWire#315",
         "path": [
           {
             "x": 800.0,
           "pinName": "D"
         },
         "pin2": {
-          "compName": "Splitter#39",
+          "compName": "Splitter#37",
           "pinName": "I"
         },
-        "name": "unnamedWire#325",
+        "name": "unnamedWire#316",
         "path": [
           {
             "x": 785.0,
       },
       {
         "pin1": {
-          "compName": "Splitter#38",
+          "compName": "Splitter#36",
           "pinName": "I"
         },
         "pin2": {
           "compName": "Am2901#1",
           "pinName": "D"
         },
-        "name": "unnamedWire#326",
+        "name": "unnamedWire#317",
         "path": [
           {
             "x": 990.0,
       },
       {
         "pin1": {
-          "compName": "Splitter#37",
+          "compName": "Splitter#35",
           "pinName": "I"
         },
         "pin2": {
           "compName": "Am2901#2",
           "pinName": "D"
         },
-        "name": "unnamedWire#327",
+        "name": "unnamedWire#318",
         "path": [
           {
             "x": 950.0,
       },
       {
         "pin1": {
-          "compName": "Splitter#36",
+          "compName": "Splitter#34",
           "pinName": "I"
         },
         "pin2": {
           "compName": "Am2901#3",
           "pinName": "D"
         },
-        "name": "unnamedWire#328",
+        "name": "unnamedWire#319",
         "path": [
           {
             "x": 910.0,
           "compName": "WireCrossPoint#29",
           "pinName": ""
         },
-        "name": "unnamedWire#329",
+        "name": "unnamedWire#320",
         "path": []
       },
       {
           "compName": "BitDisplay#1",
           "pinName": ""
         },
-        "name": "unnamedWire#330",
+        "name": "unnamedWire#321",
         "path": [
           {
             "x": 275.0,
           }
         ]
       },
-      {
-        "pin1": {
-          "compName": "Splitter#3",
-          "pinName": "O4"
-        },
-        "pin2": {
-          "compName": "Splitter#4",
-          "pinName": "O8"
-        },
-        "name": "unnamedWire#331",
-        "path": []
-      },
       {
         "pin1": {
           "compName": "WireCrossPoint#29",
           "compName": "mux1_16#0",
           "pinName": "I0"
         },
-        "name": "unnamedWire#332",
+        "name": "unnamedWire#322",
         "path": [
           {
             "x": 250.0,
           "compName": "BitDisplay#2",
           "pinName": ""
         },
-        "name": "unnamedWire#333",
+        "name": "unnamedWire#323",
         "path": [
           {
             "x": 275.0,
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#36",
+          "compName": "WireCrossPoint#33",
           "pinName": ""
         },
         "pin2": {
           "compName": "WireCrossPoint#24",
           "pinName": ""
         },
-        "name": "unnamedWire#334",
+        "name": "unnamedWire#324",
         "path": [
           {
             "x": 340.0,
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#36",
+          "compName": "WireCrossPoint#33",
           "pinName": ""
         },
         "pin2": {
           "compName": "NandGate#5",
           "pinName": "A"
         },
-        "name": "unnamedWire#335",
+        "name": "unnamedWire#325",
         "path": [
           {
             "x": 270.0,
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#37",
+          "compName": "WireCrossPoint#34",
           "pinName": ""
         },
         "pin2": {
           "compName": "WireCrossPoint#32",
           "pinName": ""
         },
-        "name": "unnamedWire#336",
-        "path": []
-      },
-      {
-        "pin1": {
-          "compName": "Splitter#3",
-          "pinName": "O3"
-        },
-        "pin2": {
-          "compName": "Splitter#4",
-          "pinName": "O7"
-        },
-        "name": "unnamedWire#337",
+        "name": "unnamedWire#326",
         "path": []
       },
       {
           "compName": "WireCrossPoint#30",
           "pinName": ""
         },
-        "name": "unnamedWire#338",
+        "name": "unnamedWire#327",
         "path": []
       },
       {
           "compName": "WireCrossPoint#5",
           "pinName": ""
         },
-        "name": "unnamedWire#339",
-        "path": []
-      },
-      {
-        "pin1": {
-          "compName": "Splitter#3",
-          "pinName": "O2"
-        },
-        "pin2": {
-          "compName": "Splitter#4",
-          "pinName": "O6"
-        },
-        "name": "unnamedWire#340",
-        "path": []
-      },
-      {
-        "pin1": {
-          "compName": "Splitter#3",
-          "pinName": "O1"
-        },
-        "pin2": {
-          "compName": "Splitter#4",
-          "pinName": "O5"
-        },
-        "name": "unnamedWire#341",
-        "path": []
-      },
-      {
-        "pin1": {
-          "compName": "Splitter#3",
-          "pinName": "O0"
-        },
-        "pin2": {
-          "compName": "Splitter#4",
-          "pinName": "O4"
-        },
-        "name": "unnamedWire#342",
+        "name": "unnamedWire#328",
         "path": []
       },
-      {
-        "pin1": {
-          "compName": "Splitter#4",
-          "pinName": "I"
-        },
-        "pin2": {
-          "compName": "mux1_12#0",
-          "pinName": "I0"
-        },
-        "name": "unnamedWire#343",
-        "path": [
-          {
-            "x": 260.0,
-            "y": 435.0
-          }
-        ]
-      },
       {
         "pin1": {
           "compName": "Am2900MemoryController#0",
           "compName": "Am2900MainMemory#0",
           "pinName": "A"
         },
-        "name": "unnamedWire#344",
+        "name": "unnamedWire#329",
         "path": [
           {
             "x": 210.0,
       },
       {
         "pin1": {
-          "compName": "Splitter#10",
+          "compName": "Splitter#8",
           "pinName": "O38"
         },
         "pin2": {
-          "compName": "WireCrossPoint#37",
+          "compName": "WireCrossPoint#34",
           "pinName": ""
         },
-        "name": "unnamedWire#345",
+        "name": "unnamedWire#330",
         "path": [
           {
             "x": 725.0,
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#44",
+          "compName": "WireCrossPoint#41",
           "pinName": ""
         },
         "pin2": {
           "compName": "WireCrossPoint#20",
           "pinName": ""
         },
-        "name": "unnamedWire#346",
+        "name": "unnamedWire#331",
         "path": []
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#44",
+          "compName": "WireCrossPoint#41",
           "pinName": ""
         },
         "pin2": {
           "compName": "dff16#0",
           "pinName": "C"
         },
-        "name": "unnamedWire#347",
+        "name": "unnamedWire#332",
         "path": [
           {
             "x": 365.0,
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#42",
+          "compName": "WireCrossPoint#39",
           "pinName": ""
         },
         "pin2": {
           "compName": "dff16_invwe#0",
           "pinName": "C"
         },
-        "name": "unnamedWire#348",
+        "name": "unnamedWire#333",
         "path": [
           {
             "x": 480.0,
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#43",
+          "compName": "WireCrossPoint#40",
           "pinName": ""
         },
         "pin2": {
           "compName": "Am2910#0",
           "pinName": "Y"
         },
-        "name": "unnamedWire#349",
+        "name": "unnamedWire#334",
         "path": [
           {
             "x": 440.0,
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#43",
+          "compName": "WireCrossPoint#40",
           "pinName": ""
         },
         "pin2": {
           "compName": "BitDisplay#0",
           "pinName": ""
         },
-        "name": "unnamedWire#350",
+        "name": "unnamedWire#335",
         "path": []
       },
       {
           "compName": "Am2900MemoryController#0",
           "pinName": "RWmem"
         },
-        "name": "unnamedWire#351",
+        "name": "unnamedWire#336",
         "path": [
           {
             "x": 215.0,
           "compName": "Am2900MemoryController#0",
           "pinName": "EN"
         },
-        "name": "unnamedWire#352",
+        "name": "unnamedWire#337",
         "path": []
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#39",
+          "compName": "WireCrossPoint#36",
           "pinName": ""
         },
         "pin2": {
           "compName": "Am2900MemoryController#0",
           "pinName": "C"
         },
-        "name": "unnamedWire#353",
+        "name": "unnamedWire#338",
         "path": []
       },
       {
         "pin1": {
-          "compName": "WireCrossPoint#38",
+          "compName": "WireCrossPoint#35",
           "pinName": ""
         },
         "pin2": {
           "compName": "Am2900MemoryController#0",
           "pinName": "_C"
         },
-        "name": "unnamedWire#354",
+        "name": "unnamedWire#339",
         "path": []
       },
       {
           "pinName": ""
         },
         "pin2": {
-          "compName": "WireCrossPoint#42",
+          "compName": "WireCrossPoint#39",
           "pinName": ""
         },
-        "name": "unnamedWire#355",
+        "name": "unnamedWire#340",
         "path": []
       }
     ],
           "delegateTarget": "Am2900MicroInstructionMemory#0"
         }
       },
+      "mprom": {
+        "id": "delegating",
+        "params": {
+          "delegateTarget": "Am2900MPROM#0"
+        }
+      },
       "muir_1": {
         "id": "delegating",
         "params": {
diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MPROM.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MPROM.java
new file mode 100644 (file)
index 0000000..fbfc44d
--- /dev/null
@@ -0,0 +1,29 @@
+package net.mograsim.logic.model.am2900.components;
+
+import net.mograsim.logic.model.am2900.machine.Am2900MPROMDefinition;
+import net.mograsim.logic.model.model.LogicModelModifiable;
+import net.mograsim.logic.model.serializing.IdentifyParams;
+import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
+import net.mograsim.machine.mi.components.ModelMPROM;
+
+public class ModelAm2900MPROM extends ModelMPROM
+{
+       public ModelAm2900MPROM(LogicModelModifiable model, String name)
+       {
+               super(model, Am2900MPROMDefinition.instance, name);
+       }
+
+       @Override
+       public String getIDForSerializing(IdentifyParams idParams)
+       {
+               return "Am2900MPROM";
+       }
+
+       static
+       {
+               IndirectModelComponentCreator.setComponentSupplier(ModelAm2900MPROM.class.getCanonicalName(), (m, p, n) ->
+               {
+                       return new ModelAm2900MPROM(m, n);
+               });
+       }
+}
\ No newline at end of file
index 80bce79..0fcaed5 100644 (file)
@@ -13,6 +13,7 @@ import net.mograsim.logic.model.am2900.machine.registers.am2910.Am2910RegisterGr
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.machine.ISASchema;
 import net.mograsim.machine.MachineDefinition;
+import net.mograsim.machine.mi.MPROMDefinition;
 import net.mograsim.machine.registers.Register;
 import net.mograsim.machine.registers.RegisterGroup;
 
@@ -123,4 +124,9 @@ public class AbstractAm2900MachineDefinition implements MachineDefinition
                return Am2900MicroInstructionMemoryDefinition.instance;
        }
 
+       @Override
+       public MPROMDefinition getMPROMDefinition()
+       {
+               return Am2900MPROMDefinition.instance;
+       }
 }
diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MPROMDefinition.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MPROMDefinition.java
new file mode 100644 (file)
index 0000000..e8f4afc
--- /dev/null
@@ -0,0 +1,36 @@
+package net.mograsim.logic.model.am2900.machine;
+
+import net.mograsim.machine.mi.MPROMDefinition;
+
+public class Am2900MPROMDefinition implements MPROMDefinition
+{
+       public static final Am2900MPROMDefinition instance = new Am2900MPROMDefinition();
+
+       @Override
+       public int getMemoryAddressBits()
+       {
+               return 8;
+       }
+
+       @Override
+       public long getMinimalAddress()
+       {
+               return 0;
+       }
+
+       @Override
+       public long getMaximalAddress()
+       {
+               return 0xFF;
+       }
+
+       @Override
+       public int getMicroInstructionMemoryAddressBits()
+       {
+               return 12;
+       }
+
+       private Am2900MPROMDefinition()
+       {
+       }
+}
\ No newline at end of file
index e48134f..00c4d6d 100644 (file)
@@ -20,9 +20,11 @@ import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
 import net.mograsim.machine.Machine;
 import net.mograsim.machine.MachineDefinition;
+import net.mograsim.machine.mi.AssignableMPROM;
 import net.mograsim.machine.mi.AssignableMicroInstructionMemory;
 import net.mograsim.machine.mi.MicroInstruction;
 import net.mograsim.machine.mi.MicroInstructionDefinition;
+import net.mograsim.machine.mi.StandardMPROM;
 import net.mograsim.machine.mi.StandardMicroInstructionMemory;
 import net.mograsim.machine.mi.parameters.MicroInstructionParameter;
 import net.mograsim.machine.mi.parameters.ParameterClassification;
@@ -39,6 +41,7 @@ public class Am2900Machine implements Machine
        private Timeline timeline;
        private AssignableMainMemory mainMemory;
        private AssignableMicroInstructionMemory instMemory;
+       private AssignableMPROM mprom;
        private CoreClock clock;
        private long activeInstructionAddress;
 
@@ -59,9 +62,11 @@ public class Am2900Machine implements Machine
                mainMemory = new AssignableMainMemory(new WordAddressableMemory(am2900MachineDefinition.getMainMemoryDefinition()));
                instMemory = new AssignableMicroInstructionMemory(
                                new StandardMicroInstructionMemory(am2900MachineDefinition.getMicroInstructionMemoryDefinition()));
+               mprom = new AssignableMPROM(new StandardMPROM(am2900MachineDefinition.getMPROMDefinition()));
                timeline = LogicCoreAdapter.convert(logicModel, params);
                am2900.setHighLevelState("ram.memory_binding", mainMemory);
                am2900.setHighLevelState("mpm.memory_binding", instMemory);
+               am2900.setHighLevelState("mprom.memory_binding", mprom);
                clock = logicModel.getComponentBySubmodelPath("Am2900.Clock#0", ModelClock.class).getClock();
                clock.registerObserver(c ->
                {
@@ -177,6 +182,12 @@ public class Am2900Machine implements Machine
                return instMemory;
        }
 
+       @Override
+       public AssignableMPROM getMPROM()
+       {
+               return mprom;
+       }
+
        @Override
        public long getActiveMicroInstructionAddress()
        {
index 273a74e..c680e3c 100644 (file)
@@ -1,6 +1,7 @@
 {
   "Am2900MainMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory",
   "Am2900MicroInstructionMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory",
+  "Am2900MPROM": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MPROM",
 
   "Am2900": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json",
   "Am2900MemoryController": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900MemoryController.json",
index 66408ce..0f713b2 100644 (file)
@@ -6,6 +6,7 @@ import net.mograsim.logic.core.components.CoreClock;
 import net.mograsim.logic.core.timeline.Timeline;
 import net.mograsim.logic.core.types.BitVector;
 import net.mograsim.logic.model.model.LogicModel;
+import net.mograsim.machine.mi.AssignableMPROM;
 import net.mograsim.machine.mi.AssignableMicroInstructionMemory;
 import net.mograsim.machine.registers.Register;
 import net.mograsim.machine.standard.memory.AssignableMainMemory;
@@ -35,6 +36,8 @@ public interface Machine
 
        AssignableMicroInstructionMemory getMicroInstructionMemory();
 
+       AssignableMPROM getMPROM();
+
        void addActiveMicroInstructionChangedListener(ActiveMicroInstructionChangedListener listener);
 
        void removeActiveMicroInstructionChangedListener(ActiveMicroInstructionChangedListener listener);
index b568e7e..a379c06 100644 (file)
@@ -2,6 +2,7 @@ package net.mograsim.machine;
 
 import java.util.List;
 
+import net.mograsim.machine.mi.MPROMDefinition;
 import net.mograsim.machine.mi.MicroInstructionMemoryDefinition;
 import net.mograsim.machine.registers.Register;
 import net.mograsim.machine.registers.RegisterGroup;
@@ -81,4 +82,13 @@ public interface MachineDefinition
         */
        MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition();
 
+       /**
+        * Returns the definition of the machines instruction memory.
+        * 
+        * @return the {@link InstructionMemoryDefinition} that defines the instruction memory.
+        * 
+        * @author Daniel Kirschten
+        */
+       MPROMDefinition getMPROMDefinition();
+
 }
index f0d755f..8f1904d 100644 (file)
@@ -1,11 +1,11 @@
 package net.mograsim.machine;
 
-class StandardMemoryDefinition implements MemoryDefinition
+public class StandardMemoryDefinition implements MemoryDefinition
 {
        private final int memoryAddressBits;
        private final long minimalAddress, maximalAddress;
 
-       StandardMemoryDefinition(int memoryAddressBits, long minimalAddress, long maximalAddress)
+       public StandardMemoryDefinition(int memoryAddressBits, long minimalAddress, long maximalAddress)
        {
                super();
                this.memoryAddressBits = memoryAddressBits;
diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/AssignableMPROM.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/AssignableMPROM.java
new file mode 100644 (file)
index 0000000..0405013
--- /dev/null
@@ -0,0 +1,99 @@
+package net.mograsim.machine.mi;
+
+import java.math.BigInteger;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.machine.Memory.MemoryCellModifiedListener;
+
+public class AssignableMPROM implements MPROM, MemoryCellModifiedListener
+{
+
+       private Set<MemoryCellModifiedListener> observers = new HashSet<>();
+
+       private Set<MPROMReassignedListener> reassignmentListeners = new HashSet<>();
+       private MPROM real = null;
+
+       public AssignableMPROM(MPROM standardMPROM)
+       {
+               real = standardMPROM;
+               real.registerCellModifiedListener(this);
+       }
+
+       public void bind(MPROM real)
+       {
+               this.real.deregisterCellModifiedListener(this);
+               this.real = real;
+               real.registerCellModifiedListener(this);
+               notifyMemoryChanged(-1);
+               notifyMemoryReassigned(real);
+       }
+
+       @Override
+       public BitVector getCell(long address)
+       {
+               return real.getCell(address);
+       }
+
+       @Override
+       public void setCell(long address, BitVector data)
+       {
+               real.setCell(address, data);
+       }
+
+       @Override
+       public BigInteger getCellAsBigInteger(long address)
+       {
+               return real.getCellAsBigInteger(address);
+       }
+
+       @Override
+       public void registerCellModifiedListener(MemoryCellModifiedListener ob)
+       {
+               observers.add(ob);
+       }
+
+       @Override
+       public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
+       {
+               observers.remove(ob);
+       }
+
+       private void notifyMemoryChanged(long address)
+       {
+               observers.forEach(o -> o.update(address));
+       }
+
+       @Override
+       public MPROMDefinition getDefinition()
+       {
+               return real.getDefinition();
+       }
+
+       @Override
+       public void update(long address)
+       {
+               notifyMemoryChanged(address);
+       }
+
+       public void registerMemoryReassignedListener(MPROMReassignedListener listener)
+       {
+               reassignmentListeners.add(listener);
+       }
+
+       public void deregisterMemoryReassignedListener(MPROMReassignedListener listener)
+       {
+               reassignmentListeners.remove(listener);
+       }
+
+       private void notifyMemoryReassigned(MPROM newAssignee)
+       {
+               reassignmentListeners.forEach(l -> l.reassigned(newAssignee));
+       }
+
+       public static interface MPROMReassignedListener
+       {
+               public void reassigned(MPROM newAssignee);
+       }
+}
diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MPROM.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MPROM.java
new file mode 100644 (file)
index 0000000..0d8be38
--- /dev/null
@@ -0,0 +1,14 @@
+package net.mograsim.machine.mi;
+
+import java.math.BigInteger;
+
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.machine.Memory;
+
+public interface MPROM extends Memory<BitVector>
+{
+       public BigInteger getCellAsBigInteger(long address);
+
+       @Override
+       public MPROMDefinition getDefinition();
+}
\ No newline at end of file
diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MPROMDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MPROMDefinition.java
new file mode 100644 (file)
index 0000000..680a1fa
--- /dev/null
@@ -0,0 +1,26 @@
+package net.mograsim.machine.mi;
+
+import net.mograsim.machine.MemoryDefinition;
+
+/**
+ * This interface provides a means to get information about the machines memory architecture. It is not bound to any actual memory.
+ *
+ * @author Christian Femers
+ *
+ */
+public interface MPROMDefinition extends MemoryDefinition
+{
+       /**
+        * The width in bits of an addressable memory cell/unit. This is often 8 (= one byte). The actual cells/lines of the memory may be a lot
+        * larger.
+        * 
+        * @return the addressable unit width in bits
+        * @author Christian Femers
+        */
+       int getMicroInstructionMemoryAddressBits();
+
+       public static MPROMDefinition create(int opcodeBits, int microInstructionMemoryAddressBits)
+       {
+               return new StandardMPROMDefinition(opcodeBits, microInstructionMemoryAddressBits);
+       }
+}
diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMPROM.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMPROM.java
new file mode 100644 (file)
index 0000000..48df165
--- /dev/null
@@ -0,0 +1,73 @@
+package net.mograsim.machine.mi;
+
+import java.math.BigInteger;
+import java.util.HashSet;
+
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.machine.standard.memory.MemoryException;
+
+public class StandardMPROM implements MPROM
+{
+       private BitVector[] data;
+       private MPROMDefinition definition;
+       private HashSet<MemoryCellModifiedListener> observers = new HashSet<>();
+
+       public StandardMPROM(MPROMDefinition definition)
+       {
+               if (definition.size() > Integer.MAX_VALUE)
+                       throw new MemoryException("Size of MPROM must be an int, not a long");
+               this.definition = definition;
+               data = new BitVector[(int) definition.size()];
+       }
+
+       private int translate(long address)
+       {
+               return (int) (address - definition.getMinimalAddress());
+       }
+
+       @Override
+       public BitVector getCell(long address)
+       {
+               int translatedAddress = translate(address);
+               BitVector cell = data[translatedAddress];
+               if (cell == null)
+                       cell = data[translatedAddress] = BitVector.from(address * 16, definition.getMicroInstructionMemoryAddressBits());
+               return cell;
+       }
+
+       @Override
+       public BigInteger getCellAsBigInteger(long address)
+       {
+               return getCell(address).getUnsignedValue();
+       }
+
+       @Override
+       public void setCell(long address, BitVector data)
+       {
+               this.data[translate(address)] = data;
+               notifyMemoryChanged(address);
+       }
+
+       @Override
+       public void registerCellModifiedListener(MemoryCellModifiedListener ob)
+       {
+               observers.add(ob);
+       }
+
+       @Override
+       public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
+       {
+               observers.remove(ob);
+       }
+
+       private void notifyMemoryChanged(long address)
+       {
+               observers.forEach(ob -> ob.update(address));
+       }
+
+       @Override
+       public MPROMDefinition getDefinition()
+       {
+               return definition;
+       }
+}
diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMPROMDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMPROMDefinition.java
new file mode 100644 (file)
index 0000000..cbc9790
--- /dev/null
@@ -0,0 +1,20 @@
+package net.mograsim.machine.mi;
+
+import net.mograsim.machine.StandardMemoryDefinition;
+
+class StandardMPROMDefinition extends StandardMemoryDefinition implements MPROMDefinition
+{
+       private final int microInstructionMemoryAddressBits;
+
+       StandardMPROMDefinition(int opcodeBits, int microInstructionMemoryAddressBits)
+       {
+               super(opcodeBits, 0, 1 << opcodeBits);
+               this.microInstructionMemoryAddressBits = microInstructionMemoryAddressBits;
+       }
+
+       @Override
+       public int getMicroInstructionMemoryAddressBits()
+       {
+               return microInstructionMemoryAddressBits;
+       }
+}
diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMPROM.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMPROM.java
new file mode 100644 (file)
index 0000000..e2d66df
--- /dev/null
@@ -0,0 +1,81 @@
+package net.mograsim.machine.mi.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.components.BasicCoreComponent;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.timeline.TimelineEventHandler;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
+import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
+import net.mograsim.machine.Memory.MemoryCellModifiedListener;
+import net.mograsim.machine.mi.MPROM;
+import net.mograsim.machine.mi.MPROMDefinition;
+
+public class CoreMPROM extends BasicCoreComponent
+{
+       private final ReadWriteEnd data;
+       private final ReadEnd address;
+       private final MPROMDefinition definition;
+       private final MemoryCellModifiedListener memObs;
+       private MPROM memory;
+
+       public CoreMPROM(Timeline timeline, int processTime, MPROMDefinition definition, ReadWriteEnd data, ReadEnd address)
+       {
+               super(timeline, processTime);
+               if (data.width() != definition.getMicroInstructionMemoryAddressBits())
+                       throw new IllegalArgumentException(
+                                       String.format("Bit width of data wire does not match MPROM definition. Expected: %d Actual: %d",
+                                                       definition.getMicroInstructionMemoryAddressBits(), data.width()));
+               if (address.width() != definition.getMemoryAddressBits())
+                       throw new IllegalArgumentException(
+                                       String.format("Bit width of address wire does not match MPROM definition. Expected: %d Actual: %d",
+                                                       definition.getMemoryAddressBits(), address.width()));
+
+               this.data = data;
+               this.address = address;
+               this.definition = definition;
+               this.memObs = a -> update();
+               address.registerObserver(this);
+       }
+
+       public void setMemory(MPROM memory)
+       {
+               if (memory != null && !memory.getDefinition().equals(definition))
+                       throw new IllegalArgumentException("Memory of incorrect memory definition given");
+               if (this.memory != null)
+                       this.memory.registerCellModifiedListener(memObs);
+               this.memory = memory;
+               if (memory != null)
+                       memory.registerCellModifiedListener(memObs);
+               update();
+       }
+
+       public MPROM getMemory()
+       {
+               return memory;
+       }
+
+       @Override
+       public List<ReadEnd> getAllInputs()
+       {
+               return List.of(address);
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(data);
+       }
+
+       @Override
+       protected TimelineEventHandler compute()
+       {
+               if (memory == null || !address.getValues().isBinary())
+                       return e -> data.feedSignals(Bit.U.toVector(data.width()));// TODO don't always feed U, but decide to feed X or U.
+               long addressed = address.getValues().getUnsignedValueLong();
+               BitVector storedData = memory.getCell(addressed);
+               return e -> data.feedSignals(storedData);
+       }
+}
\ No newline at end of file
diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/MPROMAdapter.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/MPROMAdapter.java
new file mode 100644 (file)
index 0000000..9eab2b4
--- /dev/null
@@ -0,0 +1,30 @@
+package net.mograsim.machine.mi.components;
+
+import java.util.Map;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.CoreWire;
+import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
+import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
+import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.modeladapter.CoreModelParameters;
+import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter;
+
+public class MPROMAdapter implements ComponentAdapter<ModelMPROM>
+{
+       @Override
+       public Class<ModelMPROM> getSupportedClass()
+       {
+               return ModelMPROM.class;
+       }
+
+       @Override
+       public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelMPROM modelComponent,
+                       Map<Pin, CoreWire> logicWiresPerPin)
+       {
+               ReadWriteEnd data = logicWiresPerPin.get(modelComponent.getDataPin()).createReadWriteEnd();
+               ReadEnd address = logicWiresPerPin.get(modelComponent.getAddressPin()).createReadOnlyEnd();
+               CoreMPROM mem = new CoreMPROM(timeline, 2, modelComponent.getDefinition(), data, address);
+               modelComponent.setCoreModelBinding(mem);
+       }
+}
\ No newline at end of file
diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMPROM.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMPROM.java
new file mode 100644 (file)
index 0000000..b1f791c
--- /dev/null
@@ -0,0 +1,118 @@
+package net.mograsim.machine.mi.components;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+import net.mograsim.logic.model.model.LogicModelModifiable;
+import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.model.wires.PinUsage;
+import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
+import net.mograsim.logic.model.serializing.IdentifyParams;
+import net.mograsim.logic.model.snippets.HighLevelStateHandler;
+import net.mograsim.machine.ModelMemory;
+import net.mograsim.machine.mi.MPROM;
+import net.mograsim.machine.mi.MPROMDefinition;
+
+public abstract class ModelMPROM extends ModelMemory
+{
+       private final Pin addrPin, dataPin;
+       private CoreMPROM memory;
+       private final MPROMDefinition definition;
+
+       private final List<Consumer<Object>> memoryBindingListeners;
+
+       public ModelMPROM(LogicModelModifiable model, MPROMDefinition definition, String name)
+       {
+               super(model, 30, 80, name, "MPROM", false);
+               this.definition = definition;
+               addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, getWidth(), 30));
+               addPin(dataPin = new Pin(model, this, "D", definition.getMicroInstructionMemoryAddressBits(), PinUsage.OUTPUT, getWidth(), 50));
+
+               memoryBindingListeners = new ArrayList<>();
+
+               setHighLevelStateHandler(new HighLevelStateHandler()
+               {
+                       @Override
+                       public Object get(String stateID)
+                       {
+                               if (stateID.equals("memory_binding"))
+                                       return memory.getMemory();
+                               throw new IllegalArgumentException("No high level state with ID " + stateID);
+                       }
+
+                       @Override
+                       public void set(String stateID, Object newState)
+                       {
+                               if (stateID.equals("memory_binding"))
+                               {
+                                       memory.setMemory((MPROM) newState);
+                                       memoryBindingListeners.forEach(l -> l.accept(newState));
+                               } else
+                                       throw new IllegalArgumentException("No high level state with ID " + stateID);
+                       }
+
+                       @Override
+                       public void addListener(String stateID, Consumer<Object> stateChanged)
+                       {
+                               if (stateID.equals("memory_binding"))
+                                       memoryBindingListeners.add(stateChanged);
+                               else
+                                       throw new IllegalArgumentException("No high level state with ID " + stateID);
+                       }
+
+                       @Override
+                       public void removeListener(String stateID, Consumer<Object> stateChanged)
+                       {
+                               if (stateID.equals("memory_binding"))
+                                       memoryBindingListeners.remove(stateChanged);
+                               else
+                                       throw new IllegalArgumentException("No high level state with ID " + stateID);
+                       }
+
+                       @Override
+                       public String getIDForSerializing(IdentifyParams idParams)
+                       {
+                               return null;
+                       }
+
+                       @Override
+                       public Object getParamsForSerializing(IdentifyParams idParams)
+                       {
+                               return null;
+                       }
+               });
+
+               init();
+       }
+
+       public MPROMDefinition getDefinition()
+       {
+               return definition;
+       }
+
+       public Pin getAddressPin()
+       {
+               return addrPin;
+       }
+
+       public Pin getDataPin()
+       {
+               return dataPin;
+       }
+
+       public CoreMPROM getCoreMemory()
+       {
+               return memory;
+       }
+
+       public void setCoreModelBinding(CoreMPROM memory)
+       {
+               this.memory = memory;
+       }
+
+       static
+       {
+               LogicCoreAdapter.addComponentAdapter(new MPROMAdapter());
+       }
+}
\ No newline at end of file