From 92862c4723c5eff22257e8de06166a124efb5d77 Mon Sep 17 00:00:00 2001 From: Daniel Kirschten Date: Thu, 5 Sep 2019 22:47:50 +0200 Subject: [PATCH] Cleaned up initializing of ModelComponents (also improved HLSDebugShell) --- .../model/am2900/components/Modeldff12.java | 4 +- .../am2900/components/Modeldff4_finewe.java | 4 +- .../model/am2900/components/Modelinc12.java | 4 +- .../model/am2900/components/Modelnor12.java | 4 +- .../model/am2900/components/Modelram5_12.java | 4 +- .../model/am2900/components/Modelsel4_12.java | 4 +- .../am2904/ModelAm2904RegCTInstrDecode.java | 4 +- .../am2904/ModelAm2904ShiftInstrDecode.java | 4 +- .../am2910/ModelAm2910InstrPLA.java | 4 +- .../components/am2910/ModelAm2910RegCntr.java | 4 +- .../components/am2910/ModelAm2910SP.java | 4 +- .../mograsim/logic/model/LogicUICanvas.java | 76 ++++++++++++++++--- .../model/components/ModelComponent.java | 23 +++++- .../model/components/atomic/ModelAndGate.java | 3 +- .../components/atomic/ModelBitDisplay.java | 4 +- .../model/components/atomic/ModelClock.java | 4 +- .../components/atomic/ModelFixedOutput.java | 4 +- .../components/atomic/ModelManualSwitch.java | 4 +- .../model/components/atomic/ModelMerger.java | 4 +- .../components/atomic/ModelNandGate.java | 3 +- .../model/components/atomic/ModelNotGate.java | 6 +- .../model/components/atomic/ModelOrGate.java | 3 +- .../components/atomic/ModelSplitter.java | 4 +- .../components/atomic/ModelTextComponent.java | 4 +- .../atomic/ModelTriStateBuffer.java | 4 +- ...pleRectangularHardcodedModelComponent.java | 7 +- .../atomic/SimpleRectangularModelGate.java | 11 ++- .../SimpleRectangularSubmodelComponent.java | 10 ++- .../submodels/SubmodelComponent.java | 10 ++- .../submodels/SubmodelInterface.java | 2 +- .../model/wires/ModelWireCrossPoint.java | 4 +- .../DeserializedSubmodelComponent.java | 3 +- .../standard/memory/ModelMemoryWA.java | 4 +- 33 files changed, 194 insertions(+), 47 deletions(-) diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java index 59aaf84b..14500d5c 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java @@ -22,11 +22,13 @@ public class Modeldff12 extends SimpleRectangularHardcodedModelComponent { public Modeldff12(LogicModelModifiable model, String name) { - super(model, "dff12", name, "D flip flop\n12 bits"); + super(model, "dff12", name, "D flip flop\n12 bits", false); setSize(40, 20); addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 20), Position.TOP); addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 10), Position.RIGHT); addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); + + init(); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java index fcb355f8..a3e7047e 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java @@ -24,7 +24,7 @@ public class Modeldff4_finewe extends SimpleRectangularHardcodedModelComponent { public Modeldff4_finewe(LogicModelModifiable model, String name) { - super(model, "dff4_finewe", name, "D flip flop\n4 bits"); + super(model, "dff4_finewe", name, "D flip flop\n4 bits", false); setSize(35, 90); addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); addPin(new Pin(model, this, "_WE1", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); @@ -39,6 +39,8 @@ public class Modeldff4_finewe extends SimpleRectangularHardcodedModelComponent addPin(new Pin(model, this, "Q2", 1, PinUsage.OUTPUT, 35, 15), Position.LEFT); addPin(new Pin(model, this, "Q3", 1, PinUsage.OUTPUT, 35, 25), Position.LEFT); addPin(new Pin(model, this, "Q4", 1, PinUsage.OUTPUT, 35, 35), Position.LEFT); + + init(); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc12.java index 2f4483ad..05d2eee5 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc12.java @@ -22,11 +22,13 @@ public class Modelinc12 extends SimpleRectangularHardcodedModelComponent { public Modelinc12(LogicModelModifiable model, String name) { - super(model, "inc12", name, "Incrementer"); + super(model, "inc12", name, "Incrementer", false); setSize(40, 20); addPin(new Pin(model, this, "A", 12, PinUsage.INPUT, 20, 20), Position.TOP); addPin(new Pin(model, this, "CI", 1, PinUsage.INPUT, 40, 10), Position.LEFT); addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); + + init(); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java index 758c17e0..4304d4a2 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java @@ -22,10 +22,12 @@ public class Modelnor12 extends SimpleRectangularHardcodedModelComponent { public Modelnor12(LogicModelModifiable model, String name) { - super(model, "nor12", name, "=0"); + super(model, "nor12", name, "=0", false); setSize(35, 20); addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 0, 10), Position.RIGHT); addPin(new Pin(model, this, "Y", 1, PinUsage.OUTPUT, 35, 10), Position.LEFT); + + init(); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java index a381b0c8..53c9960d 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java @@ -26,7 +26,7 @@ public class Modelram5_12 extends SimpleRectangularHardcodedModelComponent { public Modelram5_12(LogicModelModifiable model, String name) { - super(model, "ram5_12", name, "RAM\n5 x 12 Bit"); + super(model, "ram5_12", name, "RAM\n5 x 12 Bit", false); setSize(40, 40); addPin(new Pin(model, this, "A", 3, PinUsage.INPUT, 10, 0), Position.BOTTOM); addPin(new Pin(model, this, "B", 3, PinUsage.INPUT, 30, 0), Position.BOTTOM); @@ -34,6 +34,8 @@ public class Modelram5_12 extends SimpleRectangularHardcodedModelComponent addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 0, 30), Position.RIGHT); addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 40), Position.TOP); + + init(); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java index 3aa416d2..7cce14a3 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java @@ -23,7 +23,7 @@ public class Modelsel4_12 extends SimpleRectangularHardcodedModelComponent { public Modelsel4_12(LogicModelModifiable model, String name) { - super(model, "sel4_12", name, "4-way SEL\n12 bit"); + super(model, "sel4_12", name, "4-way SEL\n12 bit", false); setSize(80, 40); addPin(new Pin(model, this, "SA", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); addPin(new Pin(model, this, "SB", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); @@ -34,6 +34,8 @@ public class Modelsel4_12 extends SimpleRectangularHardcodedModelComponent addPin(new Pin(model, this, "C", 12, PinUsage.INPUT, 50, 0), Position.BOTTOM); addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 70, 0), Position.BOTTOM); addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 40, 40), Position.TOP); + + init(); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java index e5cc1ea8..880d17c9 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java @@ -22,7 +22,7 @@ public class ModelAm2904RegCTInstrDecode extends SimpleRectangularHardcodedModel { public ModelAm2904RegCTInstrDecode(LogicModelModifiable model, String name) { - super(model, "Am2904RegCTInstrDecode", name, "Instruction\ndecode"); + super(model, "Am2904RegCTInstrDecode", name, "Instruction\ndecode", false); setSize(80, 80); addPin(new Pin(model, this, "I12-11", 2, PinUsage.INPUT, 0, 30), Position.RIGHT); addPin(new Pin(model, this, "I5-0", 6, PinUsage.INPUT, 0, 50), Position.RIGHT); @@ -69,6 +69,8 @@ public class ModelAm2904RegCTInstrDecode extends SimpleRectangularHardcodedModel // 1110: MC // 1111: _MC addPin(new Pin(model, this, "C0_MUX", 4, PinUsage.OUTPUT, 70, 80), Position.TOP); + + init(); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java index ef7b2c13..3e97cc6c 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java @@ -23,7 +23,7 @@ public class ModelAm2904ShiftInstrDecode extends SimpleRectangularHardcodedModel { public ModelAm2904ShiftInstrDecode(LogicModelModifiable model, String name) { - super(model, "Am2904ShiftInstrDecode", name, "Shift \ninstruction\ndecode"); + super(model, "Am2904ShiftInstrDecode", name, "Shift \ninstruction\ndecode", false); setSize(60, 80); addPin(new Pin(model, this, "I", 5, PinUsage.INPUT, 0, 25), Position.RIGHT); addPin(new Pin(model, this, "_SE", 1, PinUsage.INPUT, 0, 55), Position.RIGHT); @@ -65,6 +65,8 @@ public class ModelAm2904ShiftInstrDecode extends SimpleRectangularHardcodedModel // 1x: SIOn addPin(new Pin(model, this, "MC_MUX", 2, PinUsage.OUTPUT, 60, 65), Position.LEFT); addPin(new Pin(model, this, "MC_EN", 1, PinUsage.OUTPUT, 60, 75), Position.LEFT); + + init(); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java index 928578f8..a96b6795 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java @@ -21,7 +21,7 @@ public class ModelAm2910InstrPLA extends SimpleRectangularHardcodedModelComponen { public ModelAm2910InstrPLA(LogicModelModifiable model, String name) { - super(model, "Am2910InstrPLA", name, "Instr.\nPLA"); + super(model, "Am2910InstrPLA", name, "Instr.\nPLA", false); setSize(30, 85); addPin(new Pin(model, this, "PASS", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); addPin(new Pin(model, this, "I", 4, PinUsage.INPUT, 0, 20), Position.RIGHT); @@ -37,6 +37,8 @@ public class ModelAm2910InstrPLA extends SimpleRectangularHardcodedModelComponen addPin(new Pin(model, this, "YmuPC", 1, PinUsage.OUTPUT, 30, 55), Position.LEFT); addPin(new Pin(model, this, "STKI0", 1, PinUsage.OUTPUT, 30, 65), Position.LEFT); addPin(new Pin(model, this, "STKI1", 1, PinUsage.OUTPUT, 30, 75), Position.LEFT); + + init(); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java index f300e6f1..05ebf456 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java @@ -22,7 +22,7 @@ public class ModelAm2910RegCntr extends SimpleRectangularHardcodedModelComponent { public ModelAm2910RegCntr(LogicModelModifiable model, String name) { - super(model, "Am2910RegCntr", name, "Register/\nCounter"); + super(model, "Am2910RegCntr", name, "Register/\nCounter", false); setSize(40, 40); addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 0), Position.BOTTOM); addPin(new Pin(model, this, "_RLD", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); @@ -30,6 +30,8 @@ public class ModelAm2910RegCntr extends SimpleRectangularHardcodedModelComponent addPin(new Pin(model, this, "DEC", 1, PinUsage.INPUT, 0, 30), Position.RIGHT); addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 40, 20), Position.LEFT); addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 20, 40), Position.TOP); + + init(); } @Override diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java index dbcfa06e..a99fe0d5 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java @@ -22,7 +22,7 @@ public class ModelAm2910SP extends SimpleRectangularHardcodedModelComponent { public ModelAm2910SP(LogicModelModifiable model, String name) { - super(model, "Am2910SP", name, "Stack\npointer"); + super(model, "Am2910SP", name, "Stack\npointer", false); setSize(40, 30); addPin(new Pin(model, this, "STKI0", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); addPin(new Pin(model, this, "STKI1", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); @@ -30,6 +30,8 @@ public class ModelAm2910SP extends SimpleRectangularHardcodedModelComponent addPin(new Pin(model, this, "A", 3, PinUsage.OUTPUT, 10, 30), Position.TOP); addPin(new Pin(model, this, "B", 3, PinUsage.OUTPUT, 30, 30), Position.TOP); addPin(new Pin(model, this, "_FULL", 1, PinUsage.OUTPUT, 40, 15), Position.LEFT); + + init(); } @Override diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java index b0174373..b14a69e1 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java @@ -2,6 +2,8 @@ package net.mograsim.logic.model; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import org.eclipse.swt.SWT; @@ -36,7 +38,7 @@ import net.mograsim.preferences.Preferences; */ public class LogicUICanvas extends ZoomableCanvas { - private static final boolean OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL = false; + private static final boolean OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL = true; private final LogicModel model; @@ -84,15 +86,21 @@ public class LogicUICanvas extends ZoomableCanvas Combo componentSelector = new Combo(debugShell, SWT.DROP_DOWN | SWT.READ_ONLY); componentSelector.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); List componentsByItemIndex = new ArrayList<>(); - Consumer compsChanged = c -> recalculateComponentSelector(componentsByItemIndex, componentSelector, model); - model.addComponentAddedListener(compsChanged); - model.addComponentRemovedListener(compsChanged); - debugShell.addListener(SWT.Dispose, e -> + List models = new ArrayList<>(); + AtomicBoolean recalculateQueued = new AtomicBoolean(); + AtomicReference> compAdded = new AtomicReference<>(); + AtomicReference> compRemoved = new AtomicReference<>(); + compAdded.set(c -> compsChanged(compAdded.get(), compRemoved.get(), c, models, componentsByItemIndex, componentSelector, model, + recalculateQueued, true)); + compRemoved.set(c -> compsChanged(compAdded.get(), compRemoved.get(), c, models, componentsByItemIndex, componentSelector, model, + recalculateQueued, false)); + iterateModelTree(compAdded.get(), compRemoved.get(), model, models, true); + debugShell.addListener(SWT.Dispose, e -> models.forEach(m -> { - model.removeComponentAddedListener(compsChanged); - model.removeComponentRemovedListener(compsChanged); - }); - recalculateComponentSelector(componentsByItemIndex, componentSelector, model); + m.removeComponentAddedListener(compAdded.get()); + m.removeComponentRemovedListener(compRemoved.get()); + })); + queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model); new Label(debugShell, SWT.NONE).setText("Target state ID: "); Text stateIDText = new Text(debugShell, SWT.SINGLE | SWT.LEAD | SWT.BORDER); stateIDText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); @@ -161,14 +169,60 @@ public class LogicUICanvas extends ZoomableCanvas debugShell.open(); } - private void recalculateComponentSelector(List componentsByItemIndex, Combo componentSelector, LogicModel model) + private void compsChanged(Consumer compAdded, Consumer compRemoved, ModelComponent c, + List models, List componentsByItemIndex, Combo componentSelector, LogicModel model, + AtomicBoolean recalculateQueued, boolean add) + { + iterateSubmodelTree(compAdded, compRemoved, c, models, add); + queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model); + } + + private void iterateSubmodelTree(Consumer compAdded, Consumer compRemoved, + ModelComponent c, List models, boolean add) + { + if (c instanceof SubmodelComponent) + iterateModelTree(compAdded, compRemoved, ((SubmodelComponent) c).submodel, models, add); + } + + private void iterateModelTree(Consumer compAdded, Consumer compRemoved, + LogicModel model, List models, boolean add) + { + if (add ^ models.contains(model)) + { + if (add) + { + models.add(model); + model.addComponentAddedListener(compAdded); + model.addComponentRemovedListener(compRemoved); + } else + { + models.remove(model); + model.removeComponentAddedListener(compAdded); + model.removeComponentRemovedListener(compRemoved); + } + for (ModelComponent c : model.getComponentsByName().values()) + iterateSubmodelTree(compAdded, compRemoved, c, models, add); + } + } + + private void queueRecalculateComponentSelector(AtomicBoolean recalculateQueued, List componentsByItemIndex, + Combo componentSelector, LogicModel model) + { + if (recalculateQueued.compareAndSet(false, true)) + getDisplay().asyncExec(() -> recalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model)); + } + + private void recalculateComponentSelector(AtomicBoolean recalculateQueued, List componentsByItemIndex, + Combo componentSelector, LogicModel model) { + recalculateQueued.set(false); componentsByItemIndex.clear(); componentSelector.setItems(); addComponentSelectorItems(componentsByItemIndex, "", componentSelector, model); } - private void addComponentSelectorItems(List componentsByItemIndex, String base, Combo componentSelector, LogicModel model) + private void addComponentSelectorItems(List componentsByItemIndex, String base, Combo componentSelector, + LogicModel model) { model.getComponentsByName().values().stream().sorted((c1, c2) -> c1.name.compareTo(c2.name)).forEach(c -> { diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java index 40ab62fc..6fcfa9a1 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java @@ -53,6 +53,17 @@ public abstract class ModelComponent implements JSONSerializable // creation and destruction public ModelComponent(LogicModelModifiable model, String name) + { + this(model, name, true); + } + + /** + * Creates a new {@link ModelComponent} and, if callInit, initializes the component (See {@link #init()}).
+ * If callInit==false, make sure to call {@link #init()}! + * + * @author Daniel Kirschten + */ + protected ModelComponent(LogicModelModifiable model, String name, boolean callInit) { this.model = model; this.name = name == null ? model.getDefaultComponentName(this) : name; @@ -65,8 +76,16 @@ public abstract class ModelComponent implements JSONSerializable this.pinAddedListeners = new ArrayList<>(); this.pinRemovedListeners = new ArrayList<>(); - // TODO this will crash the high level state debug shell because submodel is not yet set. - // The same problem exists in LogicModelModifiable.getDefaultComponentName; see there + if (callInit) + init(); + } + + /** + * Initializes this component. This method should be called exactly once in this component's constructor.
+ * Currently, this method only registers this component in the model. + */ + protected void init() + { model.componentCreated(this, this::destroyed); } diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java index 4d145d13..3e836937 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java @@ -15,8 +15,9 @@ public class ModelAndGate extends SimpleRectangularModelGate public ModelAndGate(LogicModelModifiable model, int logicWidth, String name) { - super(model, "AndGate", "&", false, logicWidth, name); + super(model, "AndGate", "&", false, logicWidth, name, false); setInputCount(2);// TODO make variable + init(); } static diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java index 6e65cb8d..1a01e141 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java @@ -38,12 +38,14 @@ public class ModelBitDisplay extends ModelComponent public ModelBitDisplay(LogicModelModifiable model, int logicWidth, String name) { - super(model, name); + super(model, name, false); this.logicWidth = logicWidth; logicObs = (i) -> model.requestRedraw(); setSize(width, height); addPin(this.inputPin = new Pin(model, this, "", logicWidth, PinUsage.INPUT, 0, height / 2)); + + init(); } @Override diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java index 96a9d486..38963536 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java @@ -43,7 +43,7 @@ public class ModelClock extends ModelComponent public ModelClock(LogicModelModifiable model, ModelClockParams params, String name) { - super(model, name); + super(model, name, false); this.params = params; logicObs = (i) -> model.requestRedraw(); @@ -52,6 +52,8 @@ public class ModelClock extends ModelComponent this.outputPin = new Pin(model, this, "", 1, PinUsage.OUTPUT, oc.newX(width, height / 2), oc.newY(width, height / 2)); addPin(outputPin); + + init(); } @Override diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java index b889fada..1d3bb1ee 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java @@ -31,10 +31,12 @@ public class ModelFixedOutput extends ModelComponent public ModelFixedOutput(LogicModelModifiable model, BitVector bits, String name) { - super(model, name); + super(model, name, false); this.bits = bits; setSize(width, height); addPin(new Pin(model, this, "out", bits.length(), PinUsage.OUTPUT, width, height / 2)); + + init(); } @Override diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java index ff991e09..7a995041 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java @@ -41,12 +41,14 @@ public class ModelManualSwitch extends ModelComponent public ModelManualSwitch(LogicModelModifiable model, int logicWidth, String name) { - super(model, name); + super(model, name, false); this.logicWidth = logicWidth; logicObs = (i) -> model.requestRedraw(); setSize(width, height); addPin(this.outputPin = new Pin(model, this, "", logicWidth, PinUsage.OUTPUT, width, height / 2)); + + init(); } @Override diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java index ec98d789..71523921 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java @@ -36,7 +36,7 @@ public class ModelMerger extends ModelComponent public ModelMerger(LogicModelModifiable model, int logicWidth, String name) { - super(model, name); + super(model, name, false); this.logicWidth = logicWidth; setSize(width, (logicWidth - 1) * heightPerPin); double inputHeight = (logicWidth - 1) * heightPerPin; @@ -44,6 +44,8 @@ public class ModelMerger extends ModelComponent addPin(new Pin(model, this, "I" + i, 1, PinUsage.TRISTATE, 0, inputHeight)); addPin(this.outputPin = new Pin(model, this, "O", logicWidth, PinUsage.TRISTATE, width, (logicWidth - 1) * heightPerPin / 2)); inputEnds = new ReadEnd[logicWidth]; + + init(); } @Override diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java index d06c81c0..b4e91d87 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java @@ -15,8 +15,9 @@ public class ModelNandGate extends SimpleRectangularModelGate public ModelNandGate(LogicModelModifiable model, int logicWidth, String name) { - super(model, "NandGate", "&", true, logicWidth, name); + super(model, "NandGate", "&", true, logicWidth, name, false); setInputCount(2);// TODO make variable + init(); } static diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java index 995aea9d..8f3849f9 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java @@ -15,14 +15,14 @@ public class ModelNotGate extends SimpleRectangularModelGate public ModelNotGate(LogicModelModifiable model, int logicWidth, String name) { - super(model, "NotGate", "1", true, logicWidth, name); + super(model, "NotGate", "1", true, logicWidth, name, false); setInputCount(1); + init(); } static { - LogicCoreAdapter - .addComponentAdapter(new SimpleGateAdapter<>(ModelNotGate.class, (t, p, o, i) -> new CoreNotGate(t, p, i[0], o))); + LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelNotGate.class, (t, p, o, i) -> new CoreNotGate(t, p, i[0], o))); IndirectModelComponentCreator.setComponentSupplier(ModelNotGate.class.getCanonicalName(), (m, p, n) -> new ModelNotGate(m, p.getAsInt(), n)); } diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java index 888188d1..c09569ed 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java @@ -15,8 +15,9 @@ public class ModelOrGate extends SimpleRectangularModelGate public ModelOrGate(LogicModelModifiable model, int logicWidth, String name) { - super(model, "OrGate", "\u22651", false, logicWidth, name);// ">=1" + super(model, "OrGate", "\u22651", false, logicWidth, name, false);// ">=1" setInputCount(2); + init(); } static diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java index 805831fa..708a4ad0 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java @@ -36,7 +36,7 @@ public class ModelSplitter extends ModelComponent public ModelSplitter(LogicModelModifiable model, int logicWidth, String name) { - super(model, name); + super(model, name, false); this.logicWidth = logicWidth; setSize(width, (logicWidth - 1) * heightPerPin); addPin(this.inputPin = new Pin(model, this, "I", logicWidth, PinUsage.TRISTATE, 0, (logicWidth - 1) * heightPerPin / 2)); @@ -44,6 +44,8 @@ public class ModelSplitter extends ModelComponent for (int i = 0; i < logicWidth; i++, outputHeight -= 10) addPin(new Pin(model, this, "O" + i, 1, PinUsage.TRISTATE, width, outputHeight)); outputEnds = new ReadEnd[logicWidth]; + + init(); } @Override diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java index 6a0c93f8..ac0f64d7 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java @@ -26,11 +26,13 @@ public class ModelTextComponent extends ModelComponent public ModelTextComponent(LogicModelModifiable model, String text, String name) { - super(model, name); + super(model, name, false); this.text = text; // If size is unset, it defaults to 0, which could prohibit this component from being rendered, which would prohibit the size being // set to a better guess setSize(1, 1); + + init(); } @Override diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java index 6791aff8..93bff320 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java @@ -39,7 +39,7 @@ public class ModelTriStateBuffer extends ModelComponent public ModelTriStateBuffer(LogicModelModifiable model, ModelTriStateBufferParams params, String name) { - super(model, name); + super(model, name, false); this.params = params; oc = new OrientationCalculator(params.orientation, width, height); @@ -58,6 +58,8 @@ public class ModelTriStateBuffer extends ModelComponent addPin(input); addPin(output); addPin(enable); + + init(); } public final Pin getInputPin() diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java index b3956957..d47b44d5 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java @@ -38,9 +38,9 @@ public abstract class SimpleRectangularHardcodedModelComponent extends ModelComp // creation and destruction - public SimpleRectangularHardcodedModelComponent(LogicModelModifiable model, String id, String name, String centerText) + public SimpleRectangularHardcodedModelComponent(LogicModelModifiable model, String id, String name, String centerText, boolean callInit) { - super(model, name); + super(model, name, false); this.id = id; this.outlineRenderer = new DefaultOutlineRenderer(this); CenteredTextParams centeredTextParams = new CenteredTextParams(); @@ -79,6 +79,9 @@ public abstract class SimpleRectangularHardcodedModelComponent extends ModelComp recalculate.run(); } }); + + if (callInit) + init(); } // pins diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java index f455b3ca..89366013 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java @@ -39,7 +39,13 @@ public class SimpleRectangularModelGate extends ModelComponent protected SimpleRectangularModelGate(LogicModelModifiable model, String id, String label, boolean isInverted, int logicWidth, String name) { - super(model, name); + this(model, id, label, isInverted, logicWidth, name, true); + } + + protected SimpleRectangularModelGate(LogicModelModifiable model, String id, String label, boolean isInverted, int logicWidth, + String name, boolean callInit) + { + super(model, name, false); this.id = id; this.label = label; this.logicWidth = logicWidth; @@ -49,6 +55,9 @@ public class SimpleRectangularModelGate extends ModelComponent addPin(outputPin); this.inputPins = new ArrayList<>(); setInputCount(1); + + if (callInit) + init(); } protected void setInputCount(int inputCount) 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 90c6fa5d..ef567e92 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 @@ -37,7 +37,12 @@ public class SimpleRectangularSubmodelComponent extends SubmodelComponent public SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label, String name) { - super(model, name); + this(model, logicWidth, label, name, true); + } + + protected SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label, String name, boolean callInit) + { + super(model, name, false); this.label = label; this.logicWidth = logicWidth; this.inputPinNames = new ArrayList<>(); @@ -53,6 +58,9 @@ public class SimpleRectangularSubmodelComponent extends SubmodelComponent rendererParams.pinLabelMargin = pinNameMargin; setSymbolRenderer(new SimpleRectangularLikeSymbolRenderer(this, rendererParams)); setOutlineRenderer(new DefaultOutlineRenderer(this)); + + if (callInit) + init(); } protected void setInputPins(String... pinNames) 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 4a2f46c1..ffe6ed63 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 @@ -101,7 +101,12 @@ public abstract class SubmodelComponent extends ModelComponent public SubmodelComponent(LogicModelModifiable model, String name) { - super(model, name); + this(model, name, true); + } + + protected SubmodelComponent(LogicModelModifiable model, String name, boolean callInit) + { + super(model, name, false); this.submodelModifiable = new LogicModelModifiable(); this.submodel = submodelModifiable; this.submodelPins = new HashMap<>(); @@ -125,6 +130,9 @@ public abstract class SubmodelComponent extends ModelComponent model.removeRedrawHandlerChangedListener(redrawHandlerChangedListener); }); submodelModifiable.setRedrawHandler(model.getRedrawHandler()); + + if (callInit) + init(); } // pins diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java index c5e81548..f87df342 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java @@ -11,7 +11,7 @@ public class SubmodelInterface extends ModelComponent { public SubmodelInterface(LogicModelModifiable model, String name) { - super(model, name); + super(model, name, true); } @Override diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java index 0a634992..b9a5ccc6 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java @@ -53,12 +53,14 @@ public class ModelWireCrossPoint extends ModelComponent public ModelWireCrossPoint(LogicModelModifiable model, int logicWidth, String name) { - super(model, name); + super(model, name, false); this.logicWidth = logicWidth; logicObs = (i) -> model.requestRedraw(); setSize(CIRCLE_DIAM, CIRCLE_DIAM); addPin(this.pin = new Pin(model, this, "", logicWidth, PinUsage.TRISTATE, CIRCLE_RADIUS, CIRCLE_RADIUS)); + + init(); } // pins diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java index cb7d4741..33f00e15 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java @@ -28,9 +28,10 @@ public class DeserializedSubmodelComponent extends SubmodelComponent public DeserializedSubmodelComponent(LogicModelModifiable model, String name, String idForSerializingOverride, JsonElement paramsForSerializingOverride) { - super(model, name); + super(model, name, false); this.idForSerializingOverride = idForSerializingOverride; this.paramsForSerializingOverride = paramsForSerializingOverride; + init(); } @Override diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelMemoryWA.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelMemoryWA.java index f874e467..9f5b1cc9 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelMemoryWA.java +++ b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelMemoryWA.java @@ -28,7 +28,7 @@ public class ModelMemoryWA extends ModelComponent public ModelMemoryWA(LogicModelModifiable model, MainMemoryDefinition definition, String name) { - super(model, name); + super(model, name,false); this.definition = definition; CenteredTextParams renderer1Params = new CenteredTextParams(); @@ -42,6 +42,8 @@ public class ModelMemoryWA extends ModelComponent addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, 0, 10)); addPin(dataPin = new Pin(model, this, "D", definition.getCellWidth(), PinUsage.TRISTATE, 0, 30)); addPin(rWPin = new Pin(model, this, "RW", 1, PinUsage.INPUT, 0, 50)); + + init(); } public Pin getAddressPin() -- 2.17.1