From bbe38c55aaa999d025f534245f9207a88643f6e5 Mon Sep 17 00:00:00 2001 From: Daniel Kirschten Date: Sat, 31 Aug 2019 18:39:13 +0200 Subject: [PATCH] Pins now have a PinUsage --- .../model/am2900/components/GUIdff12.java | 7 ++-- .../am2900/components/GUIdff4_finewe.java | 27 +++++++------- .../model/am2900/components/GUIinc12.java | 7 ++-- .../model/am2900/components/GUInor12.java | 5 +-- .../model/am2900/components/GUIram5_12.java | 13 +++---- .../model/am2900/components/GUIsel4_12.java | 19 +++++----- .../am2904/GUIAm2904RegCTInstrDecode.java | 33 ++++++++--------- .../am2904/GUIAm2904ShiftInstrDecode.java | 21 +++++------ .../components/am2910/GUIAm2910InstrPLA.java | 29 +++++++-------- .../components/am2910/GUIAm2910RegCntr.java | 13 +++---- .../am2900/components/am2910/GUIAm2910SP.java | 13 +++---- .../model/examples/GUIComponentTestbench.java | 24 ++++--------- .../model/am2900/am2901/Am2901Testbench.java | 5 ++- .../model/editor/states/SelectionState.java | 11 ++++-- .../components/atomic/GUIBitDisplay.java | 3 +- .../components/atomic/GUIManualSwitch.java | 32 +++++------------ .../model/components/atomic/GUIMerger.java | 5 +-- .../model/components/atomic/GUISplitter.java | 5 +-- .../components/atomic/GUITriStateBuffer.java | 8 +++-- .../atomic/SimpleRectangularGUIGate.java | 5 +-- ...impleRectangularHardcodedGUIComponent.java | 21 ++--------- .../SimpleRectangularSubmodelComponent.java | 10 +++--- .../submodels/SubmodelComponent.java | 21 +++++++++-- .../logic/model/model/wires/MovablePin.java | 4 +-- .../mograsim/logic/model/model/wires/Pin.java | 11 ++++-- .../logic/model/model/wires/PinUsage.java | 18 ++++++++++ .../model/model/wires/WireCrossPoint.java | 2 +- .../ManualSwitchAdapter.java | 2 +- ...ctangularHardcodedGUIComponentAdapter.java | 6 ++-- .../LegacySubmodelComponentSerializer.java | 6 ++-- .../serializing/SubmodelComponentParams.java | 2 ++ .../SubmodelComponentSerializer.java | 17 ++++++--- .../mograsim/logic/model/util/Version.java | 36 ++++++++++++++++++- .../machine/standard/memory/GUIMemoryWA.java | 8 +++-- .../mograsim/plugin/views/LogicUIPart.java | 4 +-- 35 files changed, 261 insertions(+), 192 deletions(-) create mode 100644 net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff12.java index 5dd2f961..b4cfb897 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff12.java @@ -13,6 +13,7 @@ import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; @@ -22,9 +23,9 @@ public class GUIdff12 extends SimpleRectangularHardcodedGUIComponent { super(model, name, "D flip flop\n12 bits"); setSize(40, 20); - addPin(new Pin(this, "D", 12, 20, 20), Usage.INPUT, Position.TOP); - addPin(new Pin(this, "C", 1, 0, 10), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "Y", 12, 20, 0), Usage.OUTPUT, Position.BOTTOM); + addPin(new Pin(this, "D", 12, PinUsage.INPUT, 20, 20), Position.TOP); + addPin(new Pin(this, "C", 1, PinUsage.INPUT, 0, 10), Position.RIGHT); + addPin(new Pin(this, "Y", 12, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff4_finewe.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff4_finewe.java index c4efe938..a96f400f 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff4_finewe.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff4_finewe.java @@ -14,6 +14,7 @@ import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; @@ -23,19 +24,19 @@ public class GUIdff4_finewe extends SimpleRectangularHardcodedGUIComponent { super(model, name, "D flip flop\n4 bits"); setSize(35, 90); - addPin(new Pin(this, "C", 1, 0, 5), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "_WE1", 1, 0, 15), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "_WE2", 1, 0, 25), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "_WE3", 1, 0, 35), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "_WE4", 1, 0, 45), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "D1", 1, 0, 55), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "D2", 1, 0, 65), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "D3", 1, 0, 75), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "D4", 1, 0, 85), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "Q1", 1, 35, 5), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "Q2", 1, 35, 15), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "Q3", 1, 35, 25), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "Q4", 1, 35, 35), Usage.OUTPUT, Position.LEFT); + addPin(new Pin(this, "C", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(this, "_WE1", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); + addPin(new Pin(this, "_WE2", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); + addPin(new Pin(this, "_WE3", 1, PinUsage.INPUT, 0, 35), Position.RIGHT); + addPin(new Pin(this, "_WE4", 1, PinUsage.INPUT, 0, 45), Position.RIGHT); + addPin(new Pin(this, "D1", 1, PinUsage.INPUT, 0, 55), Position.RIGHT); + addPin(new Pin(this, "D2", 1, PinUsage.INPUT, 0, 65), Position.RIGHT); + addPin(new Pin(this, "D3", 1, PinUsage.INPUT, 0, 75), Position.RIGHT); + addPin(new Pin(this, "D4", 1, PinUsage.INPUT, 0, 85), Position.RIGHT); + addPin(new Pin(this, "Q1", 1, PinUsage.OUTPUT, 35, 5), Position.LEFT); + addPin(new Pin(this, "Q2", 1, PinUsage.OUTPUT, 35, 15), Position.LEFT); + addPin(new Pin(this, "Q3", 1, PinUsage.OUTPUT, 35, 25), Position.LEFT); + addPin(new Pin(this, "Q4", 1, PinUsage.OUTPUT, 35, 35), Position.LEFT); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIinc12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIinc12.java index cbd1f9f0..11f7f93a 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIinc12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIinc12.java @@ -14,6 +14,7 @@ import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; @@ -23,9 +24,9 @@ public class GUIinc12 extends SimpleRectangularHardcodedGUIComponent { super(model, name, "Incrementer"); setSize(40, 20); - addPin(new Pin(this, "A", 12, 20, 20), Usage.INPUT, Position.TOP); - addPin(new Pin(this, "CI", 1, 40, 10), Usage.INPUT, Position.LEFT); - addPin(new Pin(this, "Y", 12, 20, 0), Usage.OUTPUT, Position.BOTTOM); + addPin(new Pin(this, "A", 12, PinUsage.INPUT, 20, 20), Position.TOP); + addPin(new Pin(this, "CI", 1, PinUsage.INPUT, 40, 10), Position.LEFT); + addPin(new Pin(this, "Y", 12, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUInor12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUInor12.java index 5c950350..2c746658 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUInor12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUInor12.java @@ -14,6 +14,7 @@ import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; @@ -23,8 +24,8 @@ public class GUInor12 extends SimpleRectangularHardcodedGUIComponent { super(model, name, "=0"); setSize(35, 20); - addPin(new Pin(this, "D", 12, 0, 10), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "Y", 1, 35, 10), Usage.OUTPUT, Position.LEFT); + addPin(new Pin(this, "D", 12, PinUsage.INPUT, 0, 10), Position.RIGHT); + addPin(new Pin(this, "Y", 1, PinUsage.OUTPUT, 35, 10), Position.LEFT); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIram5_12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIram5_12.java index 1bf80c80..173b2ee9 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIram5_12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIram5_12.java @@ -16,6 +16,7 @@ import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; @@ -25,12 +26,12 @@ public class GUIram5_12 extends SimpleRectangularHardcodedGUIComponent { super(model, name, "RAM\n5 x 12 Bit"); setSize(40, 40); - addPin(new Pin(this, "A", 3, 10, 0), Usage.INPUT, Position.BOTTOM); - addPin(new Pin(this, "B", 3, 30, 0), Usage.INPUT, Position.BOTTOM); - addPin(new Pin(this, "WE", 1, 0, 5), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "C", 1, 0, 15), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "Y", 12, 0, 30), Usage.OUTPUT, Position.RIGHT); - addPin(new Pin(this, "D", 12, 20, 40), Usage.INPUT, Position.TOP); + addPin(new Pin(this, "A", 3, PinUsage.INPUT, 10, 0), Position.BOTTOM); + addPin(new Pin(this, "B", 3, PinUsage.INPUT, 30, 0), Position.BOTTOM); + addPin(new Pin(this, "WE", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(this, "C", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); + addPin(new Pin(this, "Y", 12, PinUsage.OUTPUT, 0, 30), Position.RIGHT); + addPin(new Pin(this, "D", 12, PinUsage.INPUT, 20, 40), Position.TOP); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIsel4_12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIsel4_12.java index 480a4b13..d59b63f0 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIsel4_12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIsel4_12.java @@ -15,6 +15,7 @@ import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; @@ -24,15 +25,15 @@ public class GUIsel4_12 extends SimpleRectangularHardcodedGUIComponent { super(model, name, "4-way SEL\n12 bit"); setSize(80, 40); - addPin(new Pin(this, "SA", 1, 0, 5), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "SB", 1, 0, 15), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "SC", 1, 0, 25), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "SD", 1, 0, 35), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "A", 12, 10, 0), Usage.INPUT, Position.BOTTOM); - addPin(new Pin(this, "B", 12, 30, 0), Usage.INPUT, Position.BOTTOM); - addPin(new Pin(this, "C", 12, 50, 0), Usage.INPUT, Position.BOTTOM); - addPin(new Pin(this, "D", 12, 70, 0), Usage.INPUT, Position.BOTTOM); - addPin(new Pin(this, "Y", 12, 40, 40), Usage.OUTPUT, Position.TOP); + addPin(new Pin(this, "SA", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(this, "SB", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); + addPin(new Pin(this, "SC", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); + addPin(new Pin(this, "SD", 1, PinUsage.INPUT, 0, 35), Position.RIGHT); + addPin(new Pin(this, "A", 12, PinUsage.INPUT, 10, 0), Position.BOTTOM); + addPin(new Pin(this, "B", 12, PinUsage.INPUT, 30, 0), Position.BOTTOM); + addPin(new Pin(this, "C", 12, PinUsage.INPUT, 50, 0), Position.BOTTOM); + addPin(new Pin(this, "D", 12, PinUsage.INPUT, 70, 0), Position.BOTTOM); + addPin(new Pin(this, "Y", 12, PinUsage.OUTPUT, 40, 40), Position.TOP); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904RegCTInstrDecode.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904RegCTInstrDecode.java index dc3c4794..596d8a8e 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904RegCTInstrDecode.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904RegCTInstrDecode.java @@ -14,6 +14,7 @@ import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; @@ -23,20 +24,20 @@ public class GUIAm2904RegCTInstrDecode extends SimpleRectangularHardcodedGUIComp { super(model, name, "Instruction\ndecode"); setSize(80, 80); - addPin(new Pin(this, "I5-0", 6, 0, 30), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "I12-11", 2, 0, 50), Usage.INPUT, Position.RIGHT); + addPin(new Pin(this, "I5-0", 6, PinUsage.INPUT, 0, 30), Position.RIGHT); + addPin(new Pin(this, "I12-11", 2, PinUsage.INPUT, 0, 50), Position.RIGHT); // muSR MUX: // 00: 0 // 01: 1 // 10: M // 11: I - addPin(new Pin(this, "muSR_MUX", 2, 80, 10), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "muSR_OVRRET", 1, 80, 20), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "muSR_CINV", 1, 80, 30), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "muSR_WEZ", 1, 80, 40), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "muSR_WEC", 1, 80, 50), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "muSR_WEN", 1, 80, 60), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "muSR_WEOVR", 1, 80, 70), Usage.OUTPUT, Position.LEFT); + addPin(new Pin(this, "muSR_MUX", 2, PinUsage.OUTPUT, 80, 10), Position.LEFT); + addPin(new Pin(this, "muSR_OVRRET", 1, PinUsage.OUTPUT, 80, 20), Position.LEFT); + addPin(new Pin(this, "muSR_CINV", 1, PinUsage.OUTPUT, 80, 30), Position.LEFT); + addPin(new Pin(this, "muSR_WEZ", 1, PinUsage.OUTPUT, 80, 40), Position.LEFT); + addPin(new Pin(this, "muSR_WEC", 1, PinUsage.OUTPUT, 80, 50), Position.LEFT); + addPin(new Pin(this, "muSR_WEN", 1, PinUsage.OUTPUT, 80, 60), Position.LEFT); + addPin(new Pin(this, "muSR_WEOVR", 1, PinUsage.OUTPUT, 80, 70), Position.LEFT); // MSR MUX: // 000: 0 // 001: 1 @@ -46,19 +47,19 @@ public class GUIAm2904RegCTInstrDecode extends SimpleRectangularHardcodedGUIComp // 101: I, invert C // 110: Swap OVR and C // 111: _M - addPin(new Pin(this, "MSR_MUX", 3, 20, 0), Usage.OUTPUT, Position.BOTTOM); - addPin(new Pin(this, "OEN", 1, 60, 0), Usage.OUTPUT, Position.BOTTOM); + addPin(new Pin(this, "MSR_MUX", 3, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); + addPin(new Pin(this, "OEN", 1, PinUsage.OUTPUT, 60, 0), Position.BOTTOM); // Y MUX: // 00: mu // 01: mu // 10: M // 11: I - addPin(new Pin(this, "Y_MUX", 2, 10, 80), Usage.OUTPUT, Position.TOP); + addPin(new Pin(this, "Y_MUX", 2, PinUsage.OUTPUT, 10, 80), Position.TOP); // CT MUX: // see Am2900 Family Data Book, Am2904, Table 4 (CT_MUX2-0 = I3-1) - addPin(new Pin(this, "CT_MUX", 3, 30, 80), Usage.OUTPUT, Position.TOP); - addPin(new Pin(this, "CT_INV", 1, 40, 80), Usage.OUTPUT, Position.TOP); - addPin(new Pin(this, "CT_EXP", 1, 50, 80), Usage.OUTPUT, Position.TOP); + addPin(new Pin(this, "CT_MUX", 3, PinUsage.OUTPUT, 30, 80), Position.TOP); + addPin(new Pin(this, "CT_INV", 1, PinUsage.OUTPUT, 40, 80), Position.TOP); + addPin(new Pin(this, "CT_EXP", 1, PinUsage.OUTPUT, 50, 80), Position.TOP); // C0 MUX: // 00xx: 0 // 01xx: 1 @@ -67,7 +68,7 @@ public class GUIAm2904RegCTInstrDecode extends SimpleRectangularHardcodedGUIComp // 1101: _muC // 1110: MC // 1111: _MC - addPin(new Pin(this, "C0_MUX", 4, 70, 80), Usage.OUTPUT, Position.TOP); + addPin(new Pin(this, "C0_MUX", 4, PinUsage.OUTPUT, 70, 80), Position.TOP); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904ShiftInstrDecode.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904ShiftInstrDecode.java index 51b6da0e..48d6f7f7 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904ShiftInstrDecode.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904ShiftInstrDecode.java @@ -14,6 +14,7 @@ import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; @@ -23,15 +24,15 @@ public class GUIAm2904ShiftInstrDecode extends SimpleRectangularHardcodedGUIComp { super(model, name, "Shift \ninstruction\ndecode"); setSize(60, 80); - addPin(new Pin(this, "I", 5, 0, 25), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "_SE", 1, 0, 55), Usage.INPUT, Position.RIGHT); + addPin(new Pin(this, "I", 5, PinUsage.INPUT, 0, 25), Position.RIGHT); + addPin(new Pin(this, "_SE", 1, PinUsage.INPUT, 0, 55), Position.RIGHT); // SIO0 MUX: // 000: 0 // 001: 1 // 01x: SIOn // 10x: QIOn // 11x: MC - addPin(new Pin(this, "SIO0_MUX", 3, 60, 5), Usage.OUTPUT, Position.LEFT); + addPin(new Pin(this, "SIO0_MUX", 3, PinUsage.OUTPUT, 60, 5), Position.LEFT); // SIOn MUX: // 000: 0 // 001: 1 @@ -41,28 +42,28 @@ public class GUIAm2904ShiftInstrDecode extends SimpleRectangularHardcodedGUIComp // 101: MN // 110: IC // 111: IN xor IVOR - addPin(new Pin(this, "SIOn_MUX", 3, 60, 15), Usage.OUTPUT, Position.LEFT); + addPin(new Pin(this, "SIOn_MUX", 3, PinUsage.OUTPUT, 60, 15), Position.LEFT); // QIO0 MUX: // 000: 0 // 001: 1 // 01x: SIOn // 10x: QIOn // 11x: MC - addPin(new Pin(this, "QIO0_MUX", 3, 60, 25), Usage.OUTPUT, Position.LEFT); + addPin(new Pin(this, "QIO0_MUX", 3, PinUsage.OUTPUT, 60, 25), Position.LEFT); // QIOn MUX: // 000: 0 // 001: 1 // 01x: SIO0 // 10x: QIO0 // 11x: MN - addPin(new Pin(this, "QIOn_MUX", 3, 60, 35), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "OEn", 1, 60, 45), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "OE0", 1, 60, 55), Usage.OUTPUT, Position.LEFT); + addPin(new Pin(this, "QIOn_MUX", 3, PinUsage.OUTPUT, 60, 35), Position.LEFT); + addPin(new Pin(this, "OEn", 1, PinUsage.OUTPUT, 60, 45), Position.LEFT); + addPin(new Pin(this, "OE0", 1, PinUsage.OUTPUT, 60, 55), Position.LEFT); // 00: SIO0 // 01: QIO0 // 1x: SIOn - addPin(new Pin(this, "MC_MUX", 2, 60, 65), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "MC_EN", 1, 60, 75), Usage.OUTPUT, Position.LEFT); + addPin(new Pin(this, "MC_MUX", 2, PinUsage.OUTPUT, 60, 65), Position.LEFT); + addPin(new Pin(this, "MC_EN", 1, PinUsage.OUTPUT, 60, 75), Position.LEFT); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910InstrPLA.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910InstrPLA.java index 6e42d2e8..2be428d4 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910InstrPLA.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910InstrPLA.java @@ -13,6 +13,7 @@ import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; @@ -22,20 +23,20 @@ public class GUIAm2910InstrPLA extends SimpleRectangularHardcodedGUIComponent { super(model, name, "Instr.\nPLA"); setSize(30, 85); - addPin(new Pin(this, "PASS", 1, 0, 5), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "I", 4, 0, 20), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "R=0", 1, 15, 0), Usage.INPUT, Position.BOTTOM); - addPin(new Pin(this, "_PL", 1, 5, 85), Usage.OUTPUT, Position.TOP); - addPin(new Pin(this, "_MAP", 1, 15, 85), Usage.OUTPUT, Position.TOP); - addPin(new Pin(this, "_VECT", 1, 25, 85), Usage.OUTPUT, Position.TOP); - addPin(new Pin(this, "RWE", 1, 30, 5), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "RDEC", 1, 30, 15), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "YD", 1, 30, 25), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "YR", 1, 30, 35), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "YF", 1, 30, 45), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "YmuPC", 1, 30, 55), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "STKI0", 1, 30, 65), Usage.OUTPUT, Position.LEFT); - addPin(new Pin(this, "STKI1", 1, 30, 75), Usage.OUTPUT, Position.LEFT); + addPin(new Pin(this, "PASS", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(this, "I", 4, PinUsage.INPUT, 0, 20), Position.RIGHT); + addPin(new Pin(this, "R=0", 1, PinUsage.INPUT, 15, 0), Position.BOTTOM); + addPin(new Pin(this, "_PL", 1, PinUsage.OUTPUT, 5, 85), Position.TOP); + addPin(new Pin(this, "_MAP", 1, PinUsage.OUTPUT, 15, 85), Position.TOP); + addPin(new Pin(this, "_VECT", 1, PinUsage.OUTPUT, 25, 85), Position.TOP); + addPin(new Pin(this, "RWE", 1, PinUsage.OUTPUT, 30, 5), Position.LEFT); + addPin(new Pin(this, "RDEC", 1, PinUsage.OUTPUT, 30, 15), Position.LEFT); + addPin(new Pin(this, "YD", 1, PinUsage.OUTPUT, 30, 25), Position.LEFT); + addPin(new Pin(this, "YR", 1, PinUsage.OUTPUT, 30, 35), Position.LEFT); + addPin(new Pin(this, "YF", 1, PinUsage.OUTPUT, 30, 45), Position.LEFT); + addPin(new Pin(this, "YmuPC", 1, PinUsage.OUTPUT, 30, 55), Position.LEFT); + addPin(new Pin(this, "STKI0", 1, PinUsage.OUTPUT, 30, 65), Position.LEFT); + addPin(new Pin(this, "STKI1", 1, PinUsage.OUTPUT, 30, 75), Position.LEFT); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910RegCntr.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910RegCntr.java index ec228c16..29136425 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910RegCntr.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910RegCntr.java @@ -13,6 +13,7 @@ import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; @@ -22,12 +23,12 @@ public class GUIAm2910RegCntr extends SimpleRectangularHardcodedGUIComponent { super(model, name, "Register/\nCounter"); setSize(40, 40); - addPin(new Pin(this, "D", 12, 20, 0), Usage.INPUT, Position.BOTTOM); - addPin(new Pin(this, "_RLD", 1, 0, 5), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "WE", 1, 0, 20), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "DEC", 1, 0, 30), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "C", 1, 40, 20), Usage.INPUT, Position.LEFT); - addPin(new Pin(this, "Y", 12, 20, 40), Usage.OUTPUT, Position.TOP); + addPin(new Pin(this, "D", 12, PinUsage.INPUT, 20, 0), Position.BOTTOM); + addPin(new Pin(this, "_RLD", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(this, "WE", 1, PinUsage.INPUT, 0, 20), Position.RIGHT); + addPin(new Pin(this, "DEC", 1, PinUsage.INPUT, 0, 30), Position.RIGHT); + addPin(new Pin(this, "C", 1, PinUsage.INPUT, 40, 20), Position.LEFT); + addPin(new Pin(this, "Y", 12, PinUsage.OUTPUT, 20, 40), Position.TOP); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910SP.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910SP.java index c4b44f36..247c94f9 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910SP.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910SP.java @@ -14,6 +14,7 @@ import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; @@ -23,12 +24,12 @@ public class GUIAm2910SP extends SimpleRectangularHardcodedGUIComponent { super(model, name, "Stack\npointer"); setSize(40, 30); - addPin(new Pin(this, "STKI0", 1, 0, 5), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "STKI1", 1, 0, 15), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "C", 1, 0, 25), Usage.INPUT, Position.RIGHT); - addPin(new Pin(this, "A", 3, 10, 30), Usage.OUTPUT, Position.TOP); - addPin(new Pin(this, "B", 3, 30, 30), Usage.OUTPUT, Position.TOP); - addPin(new Pin(this, "_FULL", 1, 40, 15), Usage.OUTPUT, Position.LEFT); + addPin(new Pin(this, "STKI0", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(this, "STKI1", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); + addPin(new Pin(this, "C", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); + addPin(new Pin(this, "A", 3, PinUsage.OUTPUT, 10, 30), Position.TOP); + addPin(new Pin(this, "B", 3, PinUsage.OUTPUT, 30, 30), Position.TOP); + addPin(new Pin(this, "_FULL", 1, PinUsage.OUTPUT, 40, 15), Position.LEFT); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GUIComponentTestbench.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GUIComponentTestbench.java index e5b24f1c..6803a500 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GUIComponentTestbench.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GUIComponentTestbench.java @@ -9,10 +9,9 @@ import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.GUIComponent; import net.mograsim.logic.model.model.components.atomic.GUIBitDisplay; import net.mograsim.logic.model.model.components.atomic.GUIManualSwitch; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent.Usage; import net.mograsim.logic.model.model.wires.GUIWire; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; public class GUIComponentTestbench @@ -27,24 +26,13 @@ public class GUIComponentTestbench { GUIComponent comp = IndirectGUIComponentCreator.createComponent(model, "file:components/am2904/GUIAm2904.json"); - // guess which pins are outputs and which are inputs - // TODO this code exists four times... but it seems too "hacky" to put it in a helper class List inputPinNames = new ArrayList<>(); List outputPinNames = new ArrayList<>(); - if (comp instanceof SimpleRectangularHardcodedGUIComponent) - { - SimpleRectangularHardcodedGUIComponent compCasted = (SimpleRectangularHardcodedGUIComponent) comp; - for (Pin p : comp.getPins().values()) - if (compCasted.getPinUsage(p) == Usage.INPUT) - inputPinNames.add(p.name); - else - outputPinNames.add(p.name); - } else - for (Pin p : comp.getPins().values()) - if (p.getRelX() < comp.getWidth()) - inputPinNames.add(p.name); - else - outputPinNames.add(p.name); + for (Pin p : comp.getPins().values()) + if (p.usage == PinUsage.INPUT) + inputPinNames.add(p.name); + else + outputPinNames.add(p.name); inputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); outputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java index b54713e8..4a8e389b 100644 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java +++ b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java @@ -17,6 +17,7 @@ import net.mograsim.logic.model.model.components.atomic.GUINotGate; import net.mograsim.logic.model.model.components.atomic.TextComponent; import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.model.wires.WireCrossPoint; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; import net.mograsim.logic.model.util.ModellingTool; @@ -55,12 +56,10 @@ public class Am2901Testbench and.moveTo(135, -30); Pin last = and.getPin("Y"); - // guess which pins are outputs and which are inputs - // TODO this code exists four times... but it seems too "hacky" to put it in a helper class List inputPinNames = new ArrayList<>(); List outputPinNames = new ArrayList<>(); for (Pin p : comp.getPins().values()) - if (p.getRelX() == 0) + if (p.usage == PinUsage.INPUT) inputPinNames.add(p.name); else outputPinNames.add(p.name); diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java index f6e8ccdb..4a02db4c 100644 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java +++ b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java @@ -15,6 +15,7 @@ import net.mograsim.logic.model.editor.handles.WireHandle.WireHandleClickInfo; import net.mograsim.logic.model.editor.ui.DialogManager; import net.mograsim.logic.model.model.wires.MovablePin; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; public class SelectionState extends EditorState { @@ -98,19 +99,23 @@ public class SelectionState extends EditorState editor.getSelection().clear(); if ((stateMask & SWT.ALT) == SWT.ALT) { - String[] result = DialogManager.openMultiTextDialog("Add Pin...", "Add", "Cancel", "Name", "Logic Width"); + String[] result = DialogManager.openMultiTextDialog("Add Pin...", "Add", "Cancel", "Name", "Logic Width", "Usage"); if (result != null) { try { - Pin p = editor.toBeEdited.addSubmodelInterface( - new MovablePin(editor.toBeEdited, result[0], Integer.parseInt(result[1]), clicked.x, clicked.y)); + Pin p = editor.toBeEdited.addSubmodelInterface(new MovablePin(editor.toBeEdited, result[0], Integer.parseInt(result[1]), + PinUsage.valueOf(result[2]), clicked.x, clicked.y)); editor.handleManager.getInterfacePinHandle(p).reqMove(clicked.x, clicked.y); } catch (NumberFormatException e) { editor.dialogManager.openWarningDialog("Failed to create Pin!", "Bit width must be a number!"); } + catch (IllegalArgumentException e) + { + editor.dialogManager.openWarningDialog("Failed to create Pin!", "Usage must be one of INPUT, OUTPUT, TRISTATE!"); + } } } } diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIBitDisplay.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIBitDisplay.java index 9d6b57e5..12c0ee84 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIBitDisplay.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIBitDisplay.java @@ -15,6 +15,7 @@ import net.mograsim.logic.core.types.BitVectorFormatter; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.GUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter; import net.mograsim.logic.model.modeladapter.componentadapters.BitDisplayAdapter; import net.mograsim.logic.model.serializing.IdentifierGetter; @@ -45,7 +46,7 @@ public class GUIBitDisplay extends GUIComponent logicObs = (i) -> model.requestRedraw(); setSize(width, height); - addPin(this.inputPin = new Pin(this, "", logicWidth, 0, height / 2)); + addPin(this.inputPin = new Pin(this, "", logicWidth, PinUsage.INPUT, 0, height / 2)); } @Override diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIManualSwitch.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIManualSwitch.java index b9a09e3c..daa7bd9a 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIManualSwitch.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIManualSwitch.java @@ -9,15 +9,14 @@ import net.haspamelodica.swt.helper.gcs.GeneralGC; import net.haspamelodica.swt.helper.swtobjectwrappers.Font; import net.haspamelodica.swt.helper.swtobjectwrappers.Point; import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.LogicObservable; import net.mograsim.logic.core.LogicObserver; import net.mograsim.logic.core.components.ManualSwitch; import net.mograsim.logic.core.types.BitVector; import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.core.wires.Wire.ReadEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.GUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter; import net.mograsim.logic.model.modeladapter.componentadapters.ManualSwitchAdapter; import net.mograsim.logic.model.serializing.IdentifierGetter; @@ -35,7 +34,6 @@ public class GUIManualSwitch extends GUIComponent private final LogicObserver logicObs; private ManualSwitch logicSwitch; - private ReadEnd end; public GUIManualSwitch(ViewModelModifiable model, int logicWidth) { @@ -49,18 +47,17 @@ public class GUIManualSwitch extends GUIComponent logicObs = (i) -> model.requestRedraw(); setSize(width, height); - addPin(this.outputPin = new Pin(this, "", logicWidth, width, height / 2)); + addPin(this.outputPin = new Pin(this, "", logicWidth, PinUsage.OUTPUT, width, height / 2)); } @Override public void render(GeneralGC gc, Rectangle visibleRegion) { - // TODO maybe draw switch state too? Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); if (foreground != null) gc.setForeground(foreground); gc.drawRectangle(getBounds()); - String label = BitVectorFormatter.formatValueAsString(end); + String label = BitVectorFormatter.formatAsString(logicSwitch == null ? null : logicSwitch.getValues()); Font oldFont = gc.getFont(); Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); gc.setFont(labelFont); @@ -72,14 +69,13 @@ public class GUIManualSwitch extends GUIComponent gc.setFont(oldFont); } - public void setLogicModelBinding(ManualSwitch logicSwitch, ReadEnd end) + public void setLogicModelBinding(ManualSwitch logicSwitch) { - deregisterLogicObs(this.end); - deregisterLogicObs(this.logicSwitch); + if (this.logicSwitch != null) + this.logicSwitch.deregisterObserver(logicObs); this.logicSwitch = logicSwitch; - this.end = end; - registerLogicObs(end); - registerLogicObs(logicSwitch); + if (logicSwitch != null) + logicSwitch.registerObserver(logicObs); } public boolean hasLogicModelBinding() @@ -116,18 +112,6 @@ public class GUIManualSwitch extends GUIComponent } } - private void registerLogicObs(LogicObservable observable) - { - if (observable != null) - observable.registerObserver(logicObs); - } - - private void deregisterLogicObs(LogicObservable observable) - { - if (observable != null) - observable.deregisterObserver(logicObs); - } - @Override public boolean clicked(double x, double y) { diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIMerger.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIMerger.java index e72cf8a6..656c91f2 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIMerger.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUIMerger.java @@ -12,6 +12,7 @@ import net.mograsim.logic.core.wires.Wire.ReadEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.GUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter; import net.mograsim.logic.model.modeladapter.componentadapters.MergerAdapter; import net.mograsim.logic.model.serializing.IdentifierGetter; @@ -43,8 +44,8 @@ public class GUIMerger extends GUIComponent setSize(width, logicWidth * heightPerPin); double inputHeight = 0; for (int i = 0; i < logicWidth; i++, inputHeight += 10) - addPin(new Pin(this, "I" + i, 1, 0, inputHeight)); - addPin(this.outputPin = new Pin(this, "O", logicWidth, width, (logicWidth - 1) * heightPerPin / 2)); + addPin(new Pin(this, "I" + i, 1, PinUsage.TRISTATE, 0, inputHeight)); + addPin(this.outputPin = new Pin(this, "O", logicWidth, PinUsage.TRISTATE, width, (logicWidth - 1) * heightPerPin / 2)); inputEnds = new ReadEnd[logicWidth]; } diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUISplitter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUISplitter.java index 0ca71c77..63650a64 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUISplitter.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUISplitter.java @@ -12,6 +12,7 @@ import net.mograsim.logic.core.wires.Wire.ReadEnd; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.GUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter; import net.mograsim.logic.model.modeladapter.componentadapters.SplitterAdapter; import net.mograsim.logic.model.serializing.IdentifierGetter; @@ -41,10 +42,10 @@ public class GUISplitter extends GUIComponent super(model, name); this.logicWidth = logicWidth; setSize(width, logicWidth * heightPerPin); - addPin(this.inputPin = new Pin(this, "I", logicWidth, 0, (logicWidth - 1) * heightPerPin / 2)); + addPin(this.inputPin = new Pin(this, "I", logicWidth, PinUsage.TRISTATE, 0, (logicWidth - 1) * heightPerPin / 2)); double outputHeight = 0; for (int i = 0; i < logicWidth; i++, outputHeight += 10) - addPin(new Pin(this, "O" + i, 1, width, outputHeight)); + addPin(new Pin(this, "O" + i, 1, PinUsage.TRISTATE, width, outputHeight)); outputEnds = new ReadEnd[logicWidth]; } diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUITriStateBuffer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUITriStateBuffer.java index bfc49d84..a81a158a 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUITriStateBuffer.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/GUITriStateBuffer.java @@ -11,6 +11,7 @@ import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.GUIComponent; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter; import net.mograsim.logic.model.modeladapter.componentadapters.TriStateBufferAdapter; import net.mograsim.logic.model.serializing.IdentifierGetter; @@ -50,11 +51,12 @@ public class GUITriStateBuffer extends GUIComponent int isInv = ordi % 2; int isStd = 1 ^ isInv; - this.input = new Pin(this, "IN", params.logicWidth, width * isInv * isHori + wHalf * isVerti, + this.input = new Pin(this, "IN", params.logicWidth, PinUsage.INPUT, width * isInv * isHori + wHalf * isVerti, height * isVerti * isStd + hHalf * isHori); - this.output = new Pin(this, "OUT", params.logicWidth, width * isStd * isHori + wHalf * isVerti, + this.output = new Pin(this, "OUT", params.logicWidth, PinUsage.OUTPUT, width * isStd * isHori + wHalf * isVerti, height * isVerti * isInv + hHalf * isHori); - this.enable = new Pin(this, "EN", 1, wQuar * isVerti + wHalf * (isAlt | isHori), hQuar * isHori + hHalf * (isAlt | isVerti)); + this.enable = new Pin(this, "EN", 1, PinUsage.INPUT, wQuar * isVerti + wHalf * (isAlt | isHori), + hQuar * isHori + hHalf * (isAlt | isVerti)); this.path = new double[] { width * (isStd ^ isHori), height * (isStd ^ isHori), width * isInv, height * isStd, width * isStd * isHori + wHalf * isVerti, height * isVerti * isInv + hHalf * isHori }; diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularGUIGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularGUIGate.java index ef7d0101..e343c586 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularGUIGate.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularGUIGate.java @@ -16,6 +16,7 @@ import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.GUIComponent; import net.mograsim.logic.model.model.wires.MovablePin; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.IdentifierGetter; import net.mograsim.preferences.Preferences; @@ -41,7 +42,7 @@ public class SimpleRectangularGUIGate extends GUIComponent this.logicWidth = logicWidth; this.isInverted = isInverted; this.rectWidth = width - (isInverted ? invertedCircleDiam : 0); - this.outputPin = new MovablePin(this, "Y", logicWidth, width, 0); + this.outputPin = new MovablePin(this, "Y", logicWidth, PinUsage.OUTPUT, width, 0); addPin(outputPin); this.inputPins = new ArrayList<>(); setInputCount(1); @@ -58,7 +59,7 @@ public class SimpleRectangularGUIGate extends GUIComponent for (int i = oldInputCount; i < inputCount; i++) { // TODO what for more than 24 input pins? - Pin pin = new Pin(this, String.valueOf((char) ('A' + i)), logicWidth, 0, pinDistance / 2 + i * pinDistance); + Pin pin = new Pin(this, String.valueOf((char) ('A' + i)), logicWidth, PinUsage.INPUT, 0, pinDistance / 2 + i * pinDistance); inputPins.add(pin); addPin(pin); } diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedGUIComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedGUIComponent.java index 1ced6d4a..c384b540 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedGUIComponent.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedGUIComponent.java @@ -1,6 +1,5 @@ package net.mograsim.logic.model.model.components.atomic; -import java.util.HashMap; import java.util.Map; import net.haspamelodica.swt.helper.gcs.GeneralGC; @@ -25,9 +24,6 @@ public abstract class SimpleRectangularHardcodedGUIComponent extends GUIComponen private static final double pinNamesHeight = 3.5; private static final double pinNamesMargin = .5; - // TODO maybe make this more general? - private final Map pinUsages; - private final DefaultOutlineRenderer outlineRenderer; private final CenteredTextSymbolRenderer centerTextRenderer; private final PinNamesSymbolRenderer pinNamesRenderer; @@ -37,7 +33,6 @@ public abstract class SimpleRectangularHardcodedGUIComponent extends GUIComponen public SimpleRectangularHardcodedGUIComponent(ViewModelModifiable model, String name, String centerText) { super(model, name); - pinUsages = new HashMap<>(); this.outlineRenderer = new DefaultOutlineRenderer(this); CenteredTextParams centeredTextParams = new CenteredTextParams(); centeredTextParams.text = centerText; @@ -52,24 +47,17 @@ public abstract class SimpleRectangularHardcodedGUIComponent extends GUIComponen // pins - protected void addPin(Pin pin, Usage usage, Position namePosition) + protected void addPin(Pin pin, Position namePosition) { super.addPin(pin); // do this first to catch errors - pinUsages.put(pin, usage); pinNamesRenderer.setPinPosition(pin, namePosition); } private void pinRemoved(Pin pin) { - pinUsages.remove(pin); pinNamesRenderer.setPinPosition(pin, null); } - public Usage getPinUsage(Pin pin) - { - return pinUsages.get(pin); - } - // logic protected abstract Object recalculate(Object lastState, Map readEnds, Map readWriteEnds); @@ -89,12 +77,7 @@ public abstract class SimpleRectangularHardcodedGUIComponent extends GUIComponen @Override protected void addPin(Pin pin) { - throw new UnsupportedOperationException("Can't add pins without setting usage, call addPin(Pin, Usage [, Position]) instead"); - } - - public static enum Usage - { - INPUT, OUTPUT, TRISTATE; + throw new UnsupportedOperationException("Can't add pins without setting usage, call addPin(Pin [, Position]) instead"); } static diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java index 041a41e2..33a0bb31 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java @@ -9,6 +9,7 @@ import java.util.List; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.wires.MovablePin; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer; import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer.SimpleRectangularLikeParams; @@ -56,15 +57,16 @@ public class SimpleRectangularSubmodelComponent extends SubmodelComponent protected void setInputPins(String... pinNames) { - setIOPins(0, inputPinNames, outputPinNames, pinNames); + setIOPins(0, inputPinNames, outputPinNames, PinUsage.INPUT, pinNames); } protected void setOutputPins(String... pinNames) { - setIOPins(width, outputPinNames, inputPinNames, pinNames); + setIOPins(width, outputPinNames, inputPinNames, PinUsage.OUTPUT, pinNames); } - private void setIOPins(double relX, List pinNamesListThisSide, List pinNamesListOtherSide, String... newPinNames) + private void setIOPins(double relX, List pinNamesListThisSide, List pinNamesListOtherSide, PinUsage usage, + String... newPinNames) { int inputCount = newPinNames.length; List newPinNamesList = Arrays.asList(newPinNames); @@ -79,7 +81,7 @@ public class SimpleRectangularSubmodelComponent extends SubmodelComponent String pinName = newPinNames[i]; int oldPinIndex = pinNamesListThisSide.indexOf(pinName); if (oldPinIndex == -1) - super.addSubmodelInterface(new MovablePin(this, pinName, logicWidth, relX, pinDistance / 2 + i * pinDistance)); + super.addSubmodelInterface(new MovablePin(this, pinName, logicWidth, usage, relX, pinDistance / 2 + i * pinDistance)); else getSupermodelMovablePin(pinName).setRelPos(relX, pinDistance / 2 + i * pinDistance); } diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java index 67209cae..621f7217 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java @@ -16,6 +16,7 @@ import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.GUIComponent; import net.mograsim.logic.model.model.wires.MovablePin; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.snippets.Renderer; /** @@ -137,8 +138,24 @@ public abstract class SubmodelComponent extends GUIComponent super.addPin(supermodelPin);// do this first to be fail-fast if the supermodel does not belong to this component String name = supermodelPin.name; - MovablePin submodelPin = new MovablePin(submodelInterface, name, supermodelPin.logicWidth, supermodelPin.getRelX() / submodelScale, - supermodelPin.getRelY() / submodelScale); + // TODO if we upgrade to Java 12, replace with switch-expression + PinUsage submodelPinUsage; + switch (supermodelPin.usage) + { + case INPUT: + submodelPinUsage = PinUsage.OUTPUT; + break; + case OUTPUT: + submodelPinUsage = PinUsage.INPUT; + break; + case TRISTATE: + submodelPinUsage = PinUsage.TRISTATE; + break; + default: + throw new IllegalArgumentException("Unknown enum constant: " + supermodelPin.usage); + } + MovablePin submodelPin = new MovablePin(submodelInterface, name, supermodelPin.logicWidth, submodelPinUsage, + supermodelPin.getRelX() / submodelScale, supermodelPin.getRelY() / submodelScale); submodelPin.addPinMovedListener(p -> { diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java index 06f4de2b..ba6d3b7e 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java @@ -9,9 +9,9 @@ import net.mograsim.logic.model.model.components.GUIComponent; */ public class MovablePin extends Pin { - public MovablePin(GUIComponent component, String name, int logicWidth, double relX, double relY) + public MovablePin(GUIComponent component, String name, int logicWidth, PinUsage usage, double relX, double relY) { - super(component, name, logicWidth, relX, relY); + super(component, name, logicWidth, usage, relX, relY); } @Override diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java index d2008733..5f6504c5 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java @@ -2,6 +2,7 @@ package net.mograsim.logic.model.model.wires; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.function.Consumer; import net.haspamelodica.swt.helper.swtobjectwrappers.Point; @@ -19,7 +20,7 @@ public class Pin { // TODO introduce input/output/tristate hints /** - * The {@link GUIComponent} this pin belongs to + * The {@link GUIComponent} this pin belongs to. */ public final GUIComponent component; /** @@ -30,6 +31,11 @@ public class Pin * The logical width of this pin. Denotes how many bits this pin consists of. */ public final int logicWidth; + /** + * How this pin is used by the component it belongs to.
+ * Note that this is only a hint. + */ + public final PinUsage usage; /** * The X position of this pin, relative to its component's location. @@ -50,11 +56,12 @@ public class Pin * * @author Daniel Kirschten */ - public Pin(GUIComponent component, String name, int logicWidth, double relX, double relY) + public Pin(GUIComponent component, String name, int logicWidth, PinUsage usage, double relX, double relY) { this.component = component; this.name = name; this.logicWidth = logicWidth; + this.usage = Objects.requireNonNull(usage); this.relX = relX; this.relY = relY; diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java new file mode 100644 index 00000000..f229d023 --- /dev/null +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java @@ -0,0 +1,18 @@ +package net.mograsim.logic.model.model.wires; + +public enum PinUsage +{ + /** + * The component never affects the value of the wire connected to the pin. + */ + INPUT, + /** + * The component is never affected by the value of the wire connected to this pin. This includes the look of the component. + */ + OUTPUT, + /** + * The component (sometimes) affects the value of the wire connected to the pin, but is also (sometimes) affected by the value of this + * wire. + */ + TRISTATE; +} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/WireCrossPoint.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/WireCrossPoint.java index c3f625c8..57515969 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/WireCrossPoint.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/WireCrossPoint.java @@ -61,7 +61,7 @@ public class WireCrossPoint extends GUIComponent logicObs = (i) -> model.requestRedraw(); setSize(CIRCLE_DIAM, CIRCLE_DIAM); - addPin(this.pin = new Pin(this, "", logicWidth, CIRCLE_RADIUS, CIRCLE_RADIUS)); + addPin(this.pin = new Pin(this, "", logicWidth, PinUsage.TRISTATE, CIRCLE_RADIUS, CIRCLE_RADIUS)); } // pins diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java index 7ba8544a..518db91d 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java @@ -24,6 +24,6 @@ public class ManualSwitchAdapter implements ComponentAdapter { ReadWriteEnd end = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd(); ManualSwitch manualSwitch = new ManualSwitch(timeline, end); - guiComponent.setLogicModelBinding(manualSwitch, end); + guiComponent.setLogicModelBinding(manualSwitch); } } \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedGUIComponentAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedGUIComponentAdapter.java index 7eeee59b..2ccc0d65 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedGUIComponentAdapter.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedGUIComponentAdapter.java @@ -11,8 +11,8 @@ import net.mograsim.logic.core.wires.Wire; import net.mograsim.logic.core.wires.Wire.ReadEnd; import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent.Usage; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.modeladapter.LogicModelParameters; //TODO support HighLevelStates @@ -49,7 +49,7 @@ public class SimpleRectangularHardcodedGUIComponentAdapter implements ComponentA { Wire wire = logicWiresPerPin.get(pin); ReadEnd end; - if (guiComponent.getPinUsage(pin) != Usage.INPUT) + if (pin.usage != PinUsage.INPUT) { ReadWriteEnd rwEnd = wire.createReadWriteEnd(); readWriteEnds.put(pin.name, rwEnd); @@ -57,7 +57,7 @@ public class SimpleRectangularHardcodedGUIComponentAdapter implements ComponentA } else end = wire.createReadOnlyEnd(); readEnds.put(pin.name, end); - if (guiComponent.getPinUsage(pin) != Usage.OUTPUT) + if (pin.usage != PinUsage.OUTPUT) end.registerObserver(logicObs); } } diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java index 2ede422c..f60fe5f1 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java @@ -15,6 +15,7 @@ import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; import net.mograsim.logic.model.model.wires.GUIWire; import net.mograsim.logic.model.model.wires.MovablePin; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacyInterfacePinParams; import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters; import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerComponentParams; @@ -171,8 +172,9 @@ public final class LegacySubmodelComponentSerializer comp.setSubmodelScale(params.submodel.innerScale); comp.setSize(params.width, params.height); for (LegacyInterfacePinParams iPinParams : params.interfacePins) - comp.addSubmodelInterface( - new MovablePin(comp, iPinParams.name, iPinParams.logicWidth, iPinParams.location.x, iPinParams.location.y)); + // TRISTATE because we don't have a better choice + comp.addSubmodelInterface(new MovablePin(comp, iPinParams.name, iPinParams.logicWidth, PinUsage.TRISTATE, iPinParams.location.x, + iPinParams.location.y)); LegacySubmodelParameters submodelParams = params.submodel; ViewModelModifiable submodelModifiable = comp.getSubmodelModifiable(); Map componentsByName = submodelModifiable.getComponentsByName(); diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java index 155b6583..1cb5fcbc 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java @@ -4,6 +4,7 @@ import com.google.gson.JsonElement; import net.haspamelodica.swt.helper.swtobjectwrappers.Point; import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.util.Version; /** @@ -37,5 +38,6 @@ public class SubmodelComponentParams extends SerializablePojo public Point location; public String name; public int logicWidth; + public PinUsage usage; } } \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java index 126e2aa8..96119678 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java @@ -8,6 +8,7 @@ import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; import net.mograsim.logic.model.model.wires.MovablePin; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.serializing.SubmodelComponentParams.InterfacePinParams; import net.mograsim.logic.model.snippets.HighLevelStateHandler; import net.mograsim.logic.model.snippets.Renderer; @@ -23,7 +24,11 @@ import net.mograsim.logic.model.util.Version; */ public final class SubmodelComponentSerializer { - public static final Version CURRENT_JSON_VERSION = Version.parseSemver("0.1.4"); + // TODO serialize pin usage + // TODO set pin usages of existing components + public static final Version JSON_VERSION_CURRENT_SERIALIZING = Version.parseSemver("0.1.4"); + public static final Version JSON_VERSION_LATEST_SUPPORTED_DESERIALIZING = Version.parseSemver("0.1.5"); + public static final Version JSON_VERSION_EARLIEST_WITH_USAGE_SERIALIZED = Version.parseSemver("0.1.4"); // convenience methods /** @@ -157,13 +162,17 @@ public final class SubmodelComponentSerializer public static SubmodelComponent deserialize(ViewModelModifiable model, SubmodelComponentParams params, String name, String idForSerializingOverride, JsonElement paramsForSerializingOverride) { + Version version = params.version; + if (version.compareTo(JSON_VERSION_LATEST_SUPPORTED_DESERIALIZING) > 0) + throw new IllegalArgumentException("JSON version " + version + " not supported yet"); + boolean hasUsageSerialized = version.compareTo(JSON_VERSION_EARLIEST_WITH_USAGE_SERIALIZED) > 0; DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, name, idForSerializingOverride, paramsForSerializingOverride); comp.setSubmodelScale(params.innerScale); comp.setSize(params.width, params.height); for (InterfacePinParams iPinParams : params.interfacePins) - comp.addSubmodelInterface( - new MovablePin(comp, iPinParams.name, iPinParams.logicWidth, iPinParams.location.x, iPinParams.location.y)); + comp.addSubmodelInterface(new MovablePin(comp, iPinParams.name, iPinParams.logicWidth, + hasUsageSerialized ? iPinParams.usage : PinUsage.TRISTATE, iPinParams.location.x, iPinParams.location.y)); ViewModelModifiable submodelModifiable = comp.getSubmodelModifiable(); ViewModelSerializer.deserialize(comp.getSubmodelModifiable(), params.submodel); comp.setSymbolRenderer(SubmodelComponentSnippetSuppliers.symbolRendererSupplier.getSnippetSupplier(params.symbolRendererSnippetID) @@ -187,7 +196,7 @@ public final class SubmodelComponentSerializer */ public static SubmodelComponentParams serialize(SubmodelComponent comp, IdentifierGetter idGetter) { - SubmodelComponentParams params = new SubmodelComponentParams(CURRENT_JSON_VERSION); + SubmodelComponentParams params = new SubmodelComponentParams(JSON_VERSION_CURRENT_SERIALIZING); params.innerScale = comp.getSubmodelScale(); params.submodel = ViewModelSerializer.serialize(comp.submodel, idGetter); diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java index ac42e13a..00aeed89 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java @@ -10,7 +10,7 @@ import com.google.gson.stream.JsonWriter; import net.mograsim.logic.model.util.Version.VersionJSONAdapter; @JsonAdapter(VersionJSONAdapter.class) -public final class Version +public final class Version implements Comparable { public final int major, minor, patch; @@ -88,6 +88,40 @@ public final class Version return is(major, minor) && this.patch == patch; } + /** + * Compares this {@link Version} with the specified version.
+ * As required by {@link Comparable#compareTo(Object)}, returns a negative integer, zero, or a positive integer as this version is less + * (earlier) than, equal to, or greater (later) than the specified version. + *

+ * If the versions are equal ({@link #major}, {@link #minor}, {@link #patch} are the same), returns 0.
+ * If they differ in {@link #patch}, but neither {@link #major} or {@link #minor} , returns +-1.
+ * If they differ in {@link #minor}, but not {@link #major}, returns +-2.
+ * If they differ in {@link #major}, returns +-3. + */ + @Override + public int compareTo(Version o) + { + if (major != o.major) + { + if (major > o.major) + return 3; + return -3; + } + if (minor != o.minor) + { + if (minor > o.minor) + return 2; + return -2; + } + if (patch != o.patch) + { + if (patch > o.patch) + return 1; + return -1; + } + return 0; + } + static class VersionJSONAdapter extends TypeAdapter { @Override diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/GUIMemoryWA.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/GUIMemoryWA.java index 079c7e5b..6dbff4c8 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/GUIMemoryWA.java +++ b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/GUIMemoryWA.java @@ -13,6 +13,7 @@ import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.GUIComponent; import net.mograsim.logic.model.model.components.atomic.GUIAndGate; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter; import net.mograsim.logic.model.serializing.IdentifierGetter; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; @@ -34,9 +35,10 @@ public class GUIMemoryWA extends GUIComponent super(model, name); this.definition = definition; setSize(width, height); - addPin(addrPin = new Pin(this, "A", definition.getMemoryAddressBits(), 0, 10)); - addPin(dataPin = new Pin(this, "D", definition.getCellWidth(), 0, 30)); - addPin(rWPin = new Pin(this, "RW", 1, 0, 50)); + //TODO check the usages + addPin(addrPin = new Pin(this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, 0, 10)); + addPin(dataPin = new Pin(this, "D", definition.getCellWidth(), PinUsage.TRISTATE, 0, 30)); + addPin(rWPin = new Pin(this, "RW", 1, PinUsage.INPUT, 0, 50)); } public Pin getAddressPin() diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java index 00b19566..81707be2 100644 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java +++ b/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java @@ -22,6 +22,7 @@ import net.mograsim.logic.model.model.components.atomic.GUIBitDisplay; import net.mograsim.logic.model.model.components.atomic.GUIManualSwitch; import net.mograsim.logic.model.model.wires.GUIWire; import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.modeladapter.LogicModelParameters; import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; @@ -85,11 +86,10 @@ public class LogicUIPart extends ViewPart { GUIComponent comp = IndirectGUIComponentCreator.createComponent(model, "GUIAm2901"); - // TODO this code exists four times... but it seems too "hacky" to put it in a helper class List inputPinNames = new ArrayList<>(); List outputPinNames = new ArrayList<>(); for (Pin p : comp.getPins().values()) - if (p.getRelX() == 0) + if (p.usage == PinUsage.INPUT) inputPinNames.add(p.name); else outputPinNames.add(p.name); -- 2.17.1