X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.logic.model.am2900%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fam2900%2Fmachine%2FAm2900Machine.java;h=a7f7379e598905a8d16b57d603f0a27dc0fd98b2;hb=b5d55c59d7069171bd928e4a945d9185ee4bc2b0;hp=fa281db411fc01ce7f1519d65a06ef933f110991;hpb=30779f58b602f508ae3b8048bdb576191f7d9980;p=Mograsim.git diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java index fa281db4..a7f7379e 100644 --- a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java @@ -10,6 +10,7 @@ import net.mograsim.logic.core.timeline.Timeline; import net.mograsim.logic.core.types.Bit; import net.mograsim.logic.core.types.BitVector; import net.mograsim.logic.model.am2900.machine.registers.Am2900Register; +import net.mograsim.logic.model.am2900.machine.registers.muInstrRegister; import net.mograsim.logic.model.model.LogicModel; import net.mograsim.logic.model.model.LogicModelModifiable; import net.mograsim.logic.model.model.components.ModelComponent; @@ -17,18 +18,20 @@ import net.mograsim.logic.model.model.components.atomic.ModelClock; import net.mograsim.logic.model.modeladapter.CoreModelParameters; import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.machine.AssignableMainMemory; import net.mograsim.machine.Machine; import net.mograsim.machine.MachineDefinition; +import net.mograsim.machine.StandardMainMemory; +import net.mograsim.machine.mi.AssignableMPROM; import net.mograsim.machine.mi.AssignableMicroInstructionMemory; import net.mograsim.machine.mi.MicroInstruction; import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.StandardMPROM; import net.mograsim.machine.mi.StandardMicroInstructionMemory; import net.mograsim.machine.mi.parameters.MicroInstructionParameter; import net.mograsim.machine.mi.parameters.ParameterClassification; import net.mograsim.machine.registers.Register; import net.mograsim.machine.registers.RegisterGroup; -import net.mograsim.machine.standard.memory.AssignableMainMemory; -import net.mograsim.machine.standard.memory.WordAddressableMemory; public class Am2900Machine implements Machine { @@ -38,6 +41,7 @@ public class Am2900Machine implements Machine private Timeline timeline; private AssignableMainMemory mainMemory; private AssignableMicroInstructionMemory instMemory; + private AssignableMPROM mprom; private CoreClock clock; private long activeInstructionAddress; @@ -53,13 +57,16 @@ public class Am2900Machine implements Machine CoreModelParameters params = new CoreModelParameters(); params.gateProcessTime = 50; + params.hardcodedComponentProcessTime = params.gateProcessTime * 5; params.wireTravelTime = 10; - mainMemory = new AssignableMainMemory(new WordAddressableMemory(am2900MachineDefinition.getMainMemoryDefinition())); + mainMemory = new AssignableMainMemory(new StandardMainMemory(am2900MachineDefinition.getMainMemoryDefinition())); instMemory = new AssignableMicroInstructionMemory( new StandardMicroInstructionMemory(am2900MachineDefinition.getMicroInstructionMemoryDefinition())); + mprom = new AssignableMPROM(new StandardMPROM(am2900MachineDefinition.getMPROMDefinition())); timeline = LogicCoreAdapter.convert(logicModel, params); am2900.setHighLevelState("ram.memory_binding", mainMemory); am2900.setHighLevelState("mpm.memory_binding", instMemory); + am2900.setHighLevelState("mprom.memory_binding", mprom); clock = logicModel.getComponentBySubmodelPath("Am2900.Clock#0", ModelClock.class).getClock(); clock.registerObserver(c -> { @@ -87,26 +94,25 @@ public class Am2900Machine implements Machine defaultParams[19] = paramClassifications[19].parse("JZ"); MicroInstruction jzMI = MicroInstruction.create(defaultParams); am2900.setHighLevelState("muir_2.q", jzMI.toBitVector()); - if (!machineDefinition.strict) - { - setRegistersToZero(machineDefinition.getUnsortedRegisters()); - setRegisterGroupToZero(machineDefinition.getRegisterGroups()); - // TODO reset latches? - } + Bit regsValue = machineDefinition.expert ? Bit.U : Bit.ZERO; + setRegistersTo(machineDefinition.getUnsortedRegisters(), regsValue); + setRegisterGroupTo(machineDefinition.getRegisterGroups(), regsValue); + // TODO reset latches? } - private void setRegistersToZero(List registers) + private void setRegistersTo(List registers, Bit value) { for (Register r : registers) - setRegister(r, BitVector.of(Bit.ZERO, r.getWidth())); + if (r != muInstrRegister.instance)// don't reset; sometimes causes a glitch + setRegister(r, BitVector.of(value, r.getWidth())); } - private void setRegisterGroupToZero(List registerGroups) + private void setRegisterGroupTo(List registerGroups, Bit value) { for (RegisterGroup rg : registerGroups) { - setRegistersToZero(rg.getRegisters()); - setRegisterGroupToZero(rg.getSubGroups()); + setRegistersTo(rg.getRegisters(), value); + setRegisterGroupTo(rg.getSubGroups(), value); } } @@ -176,6 +182,12 @@ public class Am2900Machine implements Machine return instMemory; } + @Override + public AssignableMPROM getMPROM() + { + return mprom; + } + @Override public long getActiveMicroInstructionAddress() {