diff --git a/src/main/dig/cmos/sram.dig b/src/main/dig/cmos/sram.dig new file mode 100644 index 000000000..d5fd118bc --- /dev/null +++ b/src/main/dig/cmos/sram.dig @@ -0,0 +1,4522 @@ + + + 1 + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + NFET + + + + + PFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + + + NFET + + + + + PFET + + + + + PFET + + + + + Ground + + + + + Ground + + + + + VDD + + + + + VDD + + + + + In + + + Label + D_In + + + + + + VDD + + + + + Ground + + + + + NFET + + + + + NFET + + + + + PFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + + + NFET + + + + + PFET + + + + + PFET + + + + + Ground + + + + + Ground + + + + + VDD + + + + + VDD + + + + + VDD + + + + + Ground + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + NFET + + + + + PFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + + + NFET + + + + + PFET + + + + + PFET + + + + + Ground + + + + + Ground + + + + + VDD + + + + + VDD + + + + + VDD + + + + + Ground + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + NFET + + + + + PFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + + + NFET + + + + + PFET + + + + + PFET + + + + + Ground + + + + + Ground + + + + + VDD + + + + + VDD + + + + + VDD + + + + + Ground + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + NFET + + + + + PFET + + + + + NFET + + + + + PFET + + + + + NFET + + + rotation + + + + + + + NFET + + + rotation + + + + + + + PullDown + + + + + PullDown + + + + + PullUp + + + + + PullUp + + + + + Decoder + + + Selector Bits + 2 + + + + + + Splitter + + + Input Splitting + 1,1 + + + Output Splitting + 2 + + + + + + In + + + Label + R0 + + + + + + In + + + Label + R1 + + + + + + Multiplexer + + + Selector Bits + 2 + + + flipSelPos + true + + + + + + Out + + + Label + D_Out + + + + + + Splitter + + + Input Splitting + 1,1 + + + Output Splitting + 2 + + + + + + In + + + Label + C0 + + + + + + In + + + Label + C1 + + + + + + Demultiplexer + + + Selector Bits + 2 + + + flipSelPos + true + + + + + + In + + + Label + WE + + + + + + Testcase + + + Testdata + + C0 C1 R0 R1 WE D_In D_Out + + +# write all cells to zero +0 0 0 0 0 0 0 +0 0 0 0 1 0 0 +0 0 0 0 0 0 0 + +0 0 0 1 0 0 0 +0 0 0 1 1 0 0 +0 0 0 1 0 0 0 + +0 0 1 0 0 0 0 +0 0 1 0 1 0 0 +0 0 1 0 0 0 0 + +0 0 1 1 0 0 0 +0 0 1 1 1 0 0 +0 0 1 1 0 0 0 + +0 1 0 0 0 0 0 +0 1 0 0 1 0 0 +0 1 0 0 0 0 0 + +0 1 0 1 0 0 0 +0 1 0 1 1 0 0 +0 1 0 1 0 0 0 + +0 1 1 0 0 0 0 +0 1 1 0 1 0 0 +0 1 1 0 0 0 0 + +0 1 1 1 0 0 0 +0 1 1 1 1 0 0 +0 1 1 1 0 0 0 + + +1 0 0 0 0 0 0 +1 0 0 0 1 0 0 +1 0 0 0 0 0 0 + +1 0 0 1 0 0 0 +1 0 0 1 1 0 0 +1 0 0 1 0 0 0 + +1 0 1 0 0 0 0 +1 0 1 0 1 0 0 +1 0 1 0 0 0 0 + +1 0 1 1 0 0 0 +1 0 1 1 1 0 0 +1 0 1 1 0 0 0 + +1 1 0 0 0 0 0 +1 1 0 0 1 0 0 +1 1 0 0 0 0 0 + +1 1 0 1 0 0 0 +1 1 0 1 1 0 0 +1 1 0 1 0 0 0 + +1 1 1 0 0 0 0 +1 1 1 0 1 0 0 +1 1 1 0 0 0 0 + +1 1 1 1 0 0 0 +1 1 1 1 1 0 0 +1 1 1 1 0 0 0 + + +#write cell 00 to 1 + +0 0 0 0 0 0 0 +0 0 0 0 1 1 1 +0 0 0 0 0 1 1 +0 0 0 0 0 0 1 + +# cell 11 is still zero + +0 1 0 1 0 0 0 + +# cell 00 is still 1 + +0 0 0 0 0 0 1 + + + + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + LED + + + rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/de/neemann/digital/core/element/PinDescription.java b/src/main/java/de/neemann/digital/core/element/PinDescription.java index 1cca12447..a856248e4 100644 --- a/src/main/java/de/neemann/digital/core/element/PinDescription.java +++ b/src/main/java/de/neemann/digital/core/element/PinDescription.java @@ -9,9 +9,10 @@ public interface PinDescription { /** * The possible pull resistor configurations + * "both" is an error condition which can happen if nets are merged */ enum PullResistor { - none, pullUp, pullDown + none, pullUp, pullDown, both } /** diff --git a/src/main/java/de/neemann/digital/core/wiring/bus/AbstractBusHandler.java b/src/main/java/de/neemann/digital/core/wiring/bus/AbstractBusHandler.java index 466bc574d..a881403e1 100644 --- a/src/main/java/de/neemann/digital/core/wiring/bus/AbstractBusHandler.java +++ b/src/main/java/de/neemann/digital/core/wiring/bus/AbstractBusHandler.java @@ -54,31 +54,36 @@ public abstract class AbstractBusHandler { public void recalculate() { long value = 0; burn = false; - boolean highz = true; - for (ObservableValue input : getInputs()) { - if (!input.isHighZ()) { - if (highz) { - highz = false; - value = input.getValue(); - } else { - if (value != input.getValue()) - burn = true; + if (getResistor().equals(PinDescription.PullResistor.both)) { + burn = true; + set(0, true); + } else { + boolean highz = true; + for (ObservableValue input : getInputs()) { + if (!input.isHighZ()) { + if (highz) { + highz = false; + value = input.getValue(); + } else { + if (value != input.getValue()) + burn = true; + } } } + if (highz) { + switch (getResistor()) { + case pullUp: + set(-1, false); + break; + case pullDown: + set(0, false); + break; + default: + set(value, true); + } + } else + set(value, false); } - if (highz) { - switch (getResistor()) { - case pullUp: - set(-1, false); - break; - case pullDown: - set(0, false); - break; - default: - set(value, highz); - } - } else - set(value, highz); // if burn condition and not yet added for post step check add for post step check if (burn && (obs.getVersion() != addedVersion)) { @@ -89,7 +94,7 @@ public abstract class AbstractBusHandler { /** * Called to check if this net is in a burn condition. - * A burn condition does not immediately throw an exception, because intermediate burn condition are + * A burn condition does not immediately throw an exception, because intermediate burn conditions are * unavoidable. So this method is called if the step is completed. If a step ends with a burn condition * an exception is thrown. */ diff --git a/src/main/java/de/neemann/digital/core/wiring/bus/BusModelStateObserver.java b/src/main/java/de/neemann/digital/core/wiring/bus/BusModelStateObserver.java index a72705d92..3d79fea19 100644 --- a/src/main/java/de/neemann/digital/core/wiring/bus/BusModelStateObserver.java +++ b/src/main/java/de/neemann/digital/core/wiring/bus/BusModelStateObserver.java @@ -97,6 +97,7 @@ public final class BusModelStateObserver implements ModelStateObserver { h1.addNet(h2); for (CommonBusValue v : h2.getValues()) netMap.put(v, h1); + createdHandlers.remove(h2); } } } diff --git a/src/main/java/de/neemann/digital/core/wiring/bus/ConnectedBusHandler.java b/src/main/java/de/neemann/digital/core/wiring/bus/ConnectedBusHandler.java index d7ca66a3e..0011f55fb 100644 --- a/src/main/java/de/neemann/digital/core/wiring/bus/ConnectedBusHandler.java +++ b/src/main/java/de/neemann/digital/core/wiring/bus/ConnectedBusHandler.java @@ -1,6 +1,5 @@ package de.neemann.digital.core.wiring.bus; -import de.neemann.digital.core.BurnException; import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.element.PinDescription; @@ -43,8 +42,8 @@ public final class ConnectedBusHandler extends AbstractBusHandler { resistor = net.getResistor(); } else { if (!resistor.equals(net.getResistor())) { - // ToDo different resistors! - throw new BurnException(inputs); + // set error condition + resistor = PinDescription.PullResistor.both; } } } diff --git a/src/test/java/de/neemann/digital/core/wiring/bus/ConnectedBusHandlerTest.java b/src/test/java/de/neemann/digital/core/wiring/bus/ConnectedBusHandlerTest.java new file mode 100644 index 000000000..419311c5a --- /dev/null +++ b/src/test/java/de/neemann/digital/core/wiring/bus/ConnectedBusHandlerTest.java @@ -0,0 +1,30 @@ +package de.neemann.digital.core.wiring.bus; + +import de.neemann.digital.core.ObservableValue; +import de.neemann.digital.core.element.PinDescription; +import junit.framework.TestCase; + +/** + * Created by hneemann on 05.03.17. + */ +public class ConnectedBusHandlerTest extends TestCase { + + public void testNets() { + BusModelStateObserver obs = new BusModelStateObserver(); + ConnectedBusHandler cbh = new ConnectedBusHandler(obs); + + cbh.addNet(new CommonBusValue(1, obs, PinDescription.PullResistor.none, new ObservableValue[]{})); + assertEquals(PinDescription.PullResistor.none, cbh.getResistor()); + cbh.addNet(new CommonBusValue(1, obs, PinDescription.PullResistor.pullUp, new ObservableValue[]{})); + assertEquals(PinDescription.PullResistor.pullUp, cbh.getResistor()); + cbh.addNet(new CommonBusValue(1, obs, PinDescription.PullResistor.pullDown, new ObservableValue[]{})); + assertEquals(PinDescription.PullResistor.both, cbh.getResistor()); + cbh.addNet(new CommonBusValue(1, obs, PinDescription.PullResistor.pullDown, new ObservableValue[]{})); + assertEquals(PinDescription.PullResistor.both, cbh.getResistor()); + cbh.addNet(new CommonBusValue(1, obs, PinDescription.PullResistor.pullUp, new ObservableValue[]{})); + assertEquals(PinDescription.PullResistor.both, cbh.getResistor()); + cbh.addNet(new CommonBusValue(1, obs, PinDescription.PullResistor.none, new ObservableValue[]{})); + assertEquals(PinDescription.PullResistor.both, cbh.getResistor()); + } + +} \ No newline at end of file diff --git a/src/test/java/de/neemann/digital/integration/TestExamples.java b/src/test/java/de/neemann/digital/integration/TestExamples.java index bb9552995..628a5798a 100644 --- a/src/test/java/de/neemann/digital/integration/TestExamples.java +++ b/src/test/java/de/neemann/digital/integration/TestExamples.java @@ -28,7 +28,7 @@ public class TestExamples extends TestCase { */ public void testDistExamples() throws Exception { File examples = new File(Resources.getRoot().getParentFile().getParentFile(), "/main/dig"); - assertEquals(99, new FileScanner(this::check).scan(examples)); + assertEquals(100, new FileScanner(this::check).scan(examples)); assertEquals(51, testCasesInFiles); }