diff --git a/src/main/java/de/neemann/digital/core/memory/EEPROM.java b/src/main/java/de/neemann/digital/core/memory/EEPROM.java index a784426df..5c571221d 100644 --- a/src/main/java/de/neemann/digital/core/memory/EEPROM.java +++ b/src/main/java/de/neemann/digital/core/memory/EEPROM.java @@ -1,10 +1,5 @@ package de.neemann.digital.core.memory; -import de.neemann.digital.core.Node; -import de.neemann.digital.core.NodeException; -import de.neemann.digital.core.ObservableValue; -import de.neemann.digital.core.ObservableValues; -import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementTypeDescription; import de.neemann.digital.core.element.Keys; @@ -16,7 +11,7 @@ import static de.neemann.digital.core.element.PinInfo.input; * * @author hneemann */ -public class EEPROM extends Node implements Element { +public class EEPROM extends RAMSinglePortSel { /** * The EEPROMs {@link ElementTypeDescription} @@ -32,73 +27,22 @@ public class EEPROM extends Node implements Element { .addAttribute(Keys.LABEL) .addAttribute(Keys.DATA); - private final int bits; - private final int addrBits; - private final DataField memory; - private final ObservableValue dataOut; - - private ObservableValue addrIn; - private ObservableValue csIn; - private ObservableValue weIn; - private ObservableValue oeIn; - private ObservableValue dataIn; - private int addr; - private boolean cs; - private boolean oe; - /** * Creates a new instance * * @param attr the elements attributes */ public EEPROM(ElementAttributes attr) { - super(true); - bits = attr.get(Keys.BITS); - addrBits = attr.get(Keys.ADDR_BITS); - int size = 1 << addrBits; + super(attr); + } + + @Override + protected DataField createDataField(ElementAttributes attr, int size) { DataField memory = attr.get(Keys.DATA); - if (memory.size() < size) { + if (memory.size() != size) { memory = new DataField(memory, size); attr.set(Keys.DATA, memory); } - this.memory = memory; - dataOut = new ObservableValue("D", bits, true).setPinDescription(DESCRIPTION).setBidirectional(); + return memory; } - - @Override - public void setInputs(ObservableValues inputs) throws NodeException { - addrIn = inputs.get(0).checkBits(addrBits, this).addObserverToValue(this); - csIn = inputs.get(1).checkBits(1, this).addObserverToValue(this); - weIn = inputs.get(2).checkBits(1, this).addObserverToValue(this); - oeIn = inputs.get(3).checkBits(1, this).addObserverToValue(this); - dataIn = inputs.get(4).checkBits(bits, this).addObserverToValue(this); - } - - @Override - public void readInputs() throws NodeException { - cs = csIn.getBool(); - if (cs) { - addr = (int) addrIn.getValue(); - oe = oeIn.getBool(); - if (weIn.getBool()) { - long data = dataIn.getValue(); - memory.setData(addr, data); - } - } - } - - @Override - public void writeOutputs() throws NodeException { - if (cs && oe) { - dataOut.set(memory.getDataWord(addr), false); - } else { - dataOut.set(0, true); - } - } - - @Override - public ObservableValues getOutputs() { - return dataOut.asList(); - } - } diff --git a/src/main/java/de/neemann/digital/core/memory/RAMSinglePortSel.java b/src/main/java/de/neemann/digital/core/memory/RAMSinglePortSel.java index 70baa0f73..7380967f8 100644 --- a/src/main/java/de/neemann/digital/core/memory/RAMSinglePortSel.java +++ b/src/main/java/de/neemann/digital/core/memory/RAMSinglePortSel.java @@ -60,11 +60,22 @@ public class RAMSinglePortSel extends Node implements Element, RAMInterface { bits = attr.get(Keys.BITS); addrBits = attr.get(Keys.ADDR_BITS); size = 1 << addrBits; - memory = new DataField(size); + memory = createDataField(attr, size); label = attr.getCleanLabel(); dataOut = new ObservableValue("D", bits, true).setPinDescription(DESCRIPTION).setBidirectional(); } + /** + * creates the data field to use + * + * @param attr the elements attributes + * @param size the size of the memory + * @return the memory to use + */ + protected DataField createDataField(ElementAttributes attr, int size) { + return new DataField(size); + } + @Override public void setInputs(ObservableValues inputs) throws NodeException { addrIn = inputs.get(0).checkBits(addrBits, this).addObserverToValue(this);