--- /dev/null
+package net.mograsim.logic.model.am2900.am2904;\r
+\r
+import java.util.Collections;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import net.mograsim.logic.model.am2900.TestableCircuit;\r
+\r
+public interface TestableAm2904 extends TestableCircuit\r
+{\r
+\r
+ void setInstruction(Am2904_Inst inst);\r
+\r
+ void setCarry(Am2904_Carry carry);\r
+\r
+ void setShiftCode(String val_4_bit);\r
+\r
+ void setI10(Am2904_ShiftDir dir);\r
+\r
+ void setCX(String val_1_bit);\r
+\r
+ void setY3(String val_1_bit);\r
+\r
+ void setIZ(String val_1_bit);\r
+\r
+ void setIC(String val_1_bit);\r
+\r
+ void setIOVR(String val_1_bit);\r
+\r
+ void setIN(String val_1_bit);\r
+\r
+ default void setI(String z_c_ovr_n)\r
+ {\r
+ setIZ(z_c_ovr_n.substring(0, 1));\r
+ setIC(z_c_ovr_n.substring(1, 2));\r
+ setIOVR(z_c_ovr_n.substring(2, 3));\r
+ setIN(z_c_ovr_n.substring(3, 4));\r
+ }\r
+\r
+ void set_CEM(String val_1_bit);\r
+\r
+ void set_CEµ(String val_1_bit);\r
+\r
+ void set_OEY(String val_1_bit);\r
+\r
+ void set_OECT(String val_1_bit);\r
+\r
+ void set_SE(String val_1_bit);\r
+\r
+ void set_EZ(String val_1_bit);\r
+\r
+ void set_EC(String val_1_bit);\r
+\r
+ void set_EOVR(String val_1_bit);\r
+\r
+ void set_EN(String val_1_bit);\r
+\r
+ default void set_E(String z_c_ovr_n)\r
+ {\r
+ set_EZ(z_c_ovr_n.substring(0, 1));\r
+ set_EC(z_c_ovr_n.substring(1, 2));\r
+ set_EOVR(z_c_ovr_n.substring(2, 3));\r
+ set_EN(z_c_ovr_n.substring(3, 4));\r
+ }\r
+\r
+ void setSIO0(String val_1_bit);\r
+\r
+ void setSIO3(String val_1_bit);\r
+\r
+ void setQIO0(String val_1_bit);\r
+\r
+ void setQIO3(String val_1_bit);\r
+\r
+ String getC0();\r
+\r
+ String getCT();\r
+\r
+ String getY3();\r
+\r
+ String getSIO0();\r
+\r
+ String getSIO3();\r
+\r
+ String getQIO0();\r
+\r
+ String getQIO3();\r
+\r
+ public enum Am2904_ShiftDir\r
+ {\r
+ RIGHT, LEFT;\r
+ }\r
+\r
+ public enum Am2904_Carry\r
+ {\r
+ CI0, CI1, CX, USE_SR;\r
+ }\r
+\r
+ /**\r
+ * Pattern:<br>\r
+ * [microSR]_[machineSR]_[condCodeSource]_[condCode]<br>\r
+ * <ul>\r
+ * <li>Load = load from I inputs (Am2904s)</li>\r
+ * <li>condCodeSource = µ, M, I (and a special case: I and M)</li>\r
+ * <li>condCode = the boolean term defining the CT output</li>\r
+ * </ul>\r
+ */\r
+ public enum Am2904_Inst\r
+ {\r
+ // @formatter:off\r
+ LoadM_LoadY_µ_NxorOVRorZ(0_00),\r
+ Set_Set_µ_NxnorOVRornotZ(0_01),\r
+ Swap_Swap_µ_NxorOVR(0_02),\r
+ Reset_Reset_µ_NxnorOVR(0_03),\r
+ Load_LoadForShiftThroughOvr_µ_Z(0_04),\r
+ Load_Invert_µ_notZ(0_05),\r
+ LoadOvrRetain_Load_µ_OVR(0_06),\r
+ LoadOvrRetain_Load_µ_notOVR(0_07),\r
+ ResetZ_LoadCarryInvert_µ_CorZ(0_10),\r
+ SetZ_LoadCarryInvert_µ_notCandnotZ(0_11),\r
+ ResetC_Load_µ_C(0_12),\r
+ SetC_Load_µ_notC(0_13),\r
+ ResetN_Load_µ_notCorZ(0_14),\r
+ SetN_Load_µ_CandnotZ(0_15),\r
+ ResetOvr_Load_IM_NxorN(0_16),\r
+ SetOvr_Load_IM_NxnorN(0_17),\r
+ Load_Load_µ_NxorOVRorZ(0_20),\r
+ Load_Load_µ_NxnorOVRornotZ(0_21),\r
+ Load_Load_µ_NxorOVR(0_22),\r
+ Load_Load_µ_NxnorOVR(0_23),\r
+ Load_Load_µ_Z(0_24),\r
+ Load_Load_µ_notZ(0_25),\r
+ Load_Load_µ_OVR(0_26),\r
+ Load_Load_µ_notOVR(0_27),\r
+ LoadCarryInvert_LoadCarryInvert_µ_CorZ(0_30),\r
+ LoadCarryInvert_LoadCarryInvert_µ_notCandnotZ(0_31),\r
+ Load_Load_µ_C(0_32),\r
+ Load_Load_µ_notC(0_33),\r
+ Load_Load_µ_notCorZ(0_34),\r
+ Load_Load_µ_CandnotZ(0_35),\r
+ Load_Load_µ_N(0_36),\r
+ Load_Load_µ_notN(0_37),\r
+ Load_Load_M_NxorOVRorZ(0_40),\r
+ Load_Load_M_NxnorOVRornotZ(0_41),\r
+ Load_Load_M_NxorOVR(0_42),\r
+ Load_Load_M_NxnorOVR(0_43),\r
+ Load_Load_M_Z(0_44),\r
+ Load_Load_M_notZ(0_45),\r
+ Load_Load_M_OVR(0_46),\r
+ Load_Load_M_notOVR(0_47),\r
+ LoadCarryInvert_LoadCarryInvert_M_CorZ(0_50),\r
+ LoadCarryInvert_LoadCarryInvert_M_notCandnotZ(0_51),\r
+ Load_Load_M_C(0_52),\r
+ Load_Load_M_notC(0_53),\r
+ Load_Load_M_notCorZ(0_54),\r
+ Load_Load_M_CandnotZ(0_55),\r
+ Load_Load_M_N(0_56),\r
+ Load_Load_M_notN(0_57),\r
+ Load_Load_I_NxorOVRorZ(0_60),\r
+ Load_Load_I_NxnorOVRornotZ(0_61),\r
+ Load_Load_I_NxorOVR(0_62),\r
+ Load_Load_I_NxnorOVR(0_63),\r
+ Load_Load_I_Z(0_64),\r
+ Load_Load_I_notZ(0_65),\r
+ Load_Load_I_OVR(0_66),\r
+ Load_Load_I_notOVR(0_67),\r
+ LoadCarryInvert_LoadCarryInvert_I_notCorZ(0_70),\r
+ LoadCarryInvert_LoadCarryInvert_I_CandnotZ(0_71),\r
+ Load_Load_I_C(0_72),\r
+ Load_Load_I_notC(0_73),\r
+ Load_Load_I_notCorZ(0_74),\r
+ Load_Load_I_CandnotZ(0_75),\r
+ Load_Load_I_N(0_76),\r
+ Load_Load_I_notN(0_77);\r
+ // @formatter:on\r
+\r
+ public final int code;\r
+\r
+ private Am2904_Inst(int code)\r
+ {\r
+ this.code = code;\r
+ }\r
+\r
+ private static final Map<Integer, Am2904_Inst> instCodes;\r
+\r
+ static\r
+ {\r
+ Map<Integer, Am2904_Inst> instCodesMod = new HashMap<>();\r
+ Am2904_Inst[] vals = values();\r
+ for (Am2904_Inst inst : vals)\r
+ {\r
+ assert inst.code == inst.ordinal();\r
+ instCodesMod.put(inst.code, inst);\r
+ }\r
+ if (instCodesMod.size() != 64)\r
+ throw new IllegalStateException("There must be exactly 64 Am2904 instruction codes, but was " + instCodesMod.size());\r
+ instCodes = Collections.unmodifiableMap(instCodesMod);\r
+ }\r
+\r
+ public static Am2904_Inst getInstFor(int I_543210)\r
+ {\r
+ Am2904_Inst inst = instCodes.get(I_543210);\r
+ if (inst != null)\r
+ return inst;\r
+ throw new IllegalArgumentException("Invaild Am2904 instruction code: " + I_543210);\r
+ }\r
+\r
+ public int getBlock()\r
+ {\r
+ return code >> 4;\r
+ }\r
+\r
+ public boolean isLoadCarryInvert()\r
+ {\r
+ return (code & 0b001_110) == 0b001_000;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+package net.mograsim.logic.model.am2900.am2904;\r
+\r
+public class TestableAm2904Impl implements TestableAm2904\r
+{\r
+\r
+ @Override\r
+ public void setup()\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public Result run()\r
+ {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public void clockOn(boolean isClockOn)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setInstruction(Am2904_Inst inst)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setCarry(Am2904_Carry carry)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setShiftCode(String val_4_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setI10(Am2904_ShiftDir dir)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setCX(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setY3(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setIZ(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setIC(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setIOVR(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setIN(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void set_CEM(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void set_CEµ(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void set_OEY(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void set_OECT(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void set_SE(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void set_EZ(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void set_EC(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void set_EOVR(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void set_EN(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setSIO0(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setSIO3(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setQIO0(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public void setQIO3(String val_1_bit)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ @Override\r
+ public String getC0()\r
+ {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public String getCT()\r
+ {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public String getY3()\r
+ {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public String getSIO0()\r
+ {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public String getSIO3()\r
+ {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public String getQIO0()\r
+ {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public String getQIO3()\r
+ {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+}\r
--- /dev/null
+package net.mograsim.logic.model.am2900.am2910;\r
+\r
+import org.junit.Test;\r
+\r
+import net.mograsim.logic.core.components.BitDisplay;\r
+import net.mograsim.logic.core.components.ManualSwitch;\r
+import net.mograsim.logic.core.timeline.Timeline;\r
+import net.mograsim.logic.core.types.BitVector;\r
+import net.mograsim.logic.core.types.BitVectorFormatter;\r
+import net.mograsim.logic.model.am2900.TestEnvironmentHelper;\r
+import net.mograsim.logic.model.am2900.TestEnvironmentHelper.DebugState;\r
+import net.mograsim.logic.model.model.components.GUIComponent;\r
+\r
+public class TestableAm2910Impl implements TestableAm2910\r
+{\r
+\r
+ private GUIComponent am2901;\r
+ private Timeline timeline;\r
+ private ManualSwitch I;\r
+ private ManualSwitch C;\r
+ private ManualSwitch CI;\r
+ private ManualSwitch D;\r
+ private ManualSwitch _CC;\r
+ private ManualSwitch _CCEN;\r
+ private ManualSwitch _RDL;\r
+ private ManualSwitch _OE;\r
+ private BitDisplay _FULL;\r
+ private BitDisplay Y;\r
+ private BitDisplay _PL, _MAP, _VECT;\r
+\r
+ private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, "GUIAm2910");\r
+\r
+ @Override\r
+ public void setup()\r
+ {\r
+ testHelper.setup(DebugState.NO_DEBUG);\r
+ }\r
+\r
+ @Override\r
+ public Result run()\r
+ {\r
+ return testHelper.run();\r
+ }\r
+\r
+ @Override\r
+ public void clockOn(boolean isClockOn)\r
+ {\r
+ if (isClockOn)\r
+ C.switchFullOn();\r
+ else\r
+ C.switchFullOff();\r
+ }\r
+\r
+ @Override\r
+ public void setInstruction(Am2910_Inst inst)\r
+ {\r
+ I.setState(BitVector.of(inst.ordinal(), 4));\r
+ }\r
+\r
+ @Override\r
+ public void set_CCEN(String val_1_bit)\r
+ {\r
+ _CCEN.setState(BitVector.parse(val_1_bit));\r
+ }\r
+\r
+ @Override\r
+ public void setD(String val_12_bit)\r
+ {\r
+ D.setState(BitVector.parse(val_12_bit));\r
+ }\r
+\r
+ @Override\r
+ public void set_CC(String val_1_bit)\r
+ {\r
+ _CC.setState(BitVector.parse(val_1_bit));\r
+ }\r
+\r
+ @Override\r
+ public void setCI(String val_1_bit)\r
+ {\r
+ CI.setState(BitVector.parse(val_1_bit));\r
+ }\r
+\r
+ @Override\r
+ public void set_RLD(String val_1_bit)\r
+ {\r
+ _RDL.setState(BitVector.parse(val_1_bit));\r
+ }\r
+\r
+ @Override\r
+ public void set_OE(String val_1_bit)\r
+ {\r
+ _OE.setState(BitVector.parse(val_1_bit));\r
+ }\r
+\r
+ @Override\r
+ public String getY()\r
+ {\r
+ return Y.getDisplayedValue().toString();\r
+ }\r
+\r
+ @Override\r
+ public String get_FULL()\r
+ {\r
+ return _FULL.getDisplayedValue().toString();\r
+ }\r
+\r
+ @Override\r
+ public String get_PL()\r
+ {\r
+ return _PL.getDisplayedValue().toString();\r
+ }\r
+\r
+ @Override\r
+ public String get_MAP()\r
+ {\r
+ return _MAP.getDisplayedValue().toString();\r
+ }\r
+\r
+ @Override\r
+ public String get_VECT()\r
+ {\r
+ return _VECT.getDisplayedValue().toString();\r
+ }\r
+\r
+}\r