1 package net.mograsim.logic.core.components.gates;
3 import java.util.Arrays;
4 import java.util.HashMap;
7 import net.mograsim.logic.core.components.BasicComponent;
8 import net.mograsim.logic.core.timeline.Timeline;
9 import net.mograsim.logic.core.types.Bit;
10 import net.mograsim.logic.core.types.BitVector;
11 import net.mograsim.logic.core.wires.Wire.ReadEnd;
12 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
14 public class WordAddressableMemoryComponent extends BasicComponent
16 private final WordAddressableMemory memory;
17 private final static Bit read = Bit.ONE;
19 private ReadWriteEnd data;
20 private ReadEnd rWBit, address;
26 * @param minimalAddress
27 * @param maximalAddress
29 * @param rWBit 0: Write 1: Read
32 public WordAddressableMemoryComponent(Timeline timeline, int processTime, long minimalAddress, long maximalAddress, ReadWriteEnd data,
33 ReadEnd rWBit, ReadEnd address)
35 super(timeline, processTime);
38 this.address = address;
39 data.registerObserver(this);
40 rWBit.registerObserver(this);
41 address.registerObserver(this);
43 memory = new WordAddressableMemory(data.length(), minimalAddress, maximalAddress);
47 protected void compute()
49 if (!address.hasNumericValue())
51 if (read.equals(rWBit.getValue()))
52 data.feedSignals(BitVector.of(Bit.U, data.length()));
57 long addressed = address.getUnsignedValue();
58 if (read.equals(rWBit.getValue()))
59 data.feedSignals(memory.getCell(addressed));
63 System.out.println(memory);
64 memory.setCell(addressed, data.getValues());
69 public List<ReadEnd> getAllInputs()
71 return List.of(data, rWBit, address);
75 public List<ReadWriteEnd> getAllOutputs()
80 private class WordAddressableMemory
82 private final int cellWidth;
83 private final long minimalAddress, maximalAddress;
84 private final int pageSize;
86 private HashMap<Long, Page> pages;
88 public WordAddressableMemory(int cellWidth, long minimalAddress, long maximalAddress)
91 this.cellWidth = cellWidth;
92 this.minimalAddress = minimalAddress;
93 this.maximalAddress = maximalAddress;
94 this.pages = new HashMap<>();
98 public void setCell(long address, BitVector b)
100 if (address < minimalAddress || address > maximalAddress)
101 throw new IndexOutOfBoundsException(String.format("Memory address out of bounds! Minimum: %d Maimum: %d Actual: %d",
102 minimalAddress, maximalAddress, address));
103 long page = address / pageSize;
104 int offset = (int) (address % pageSize);
105 Page p = pages.get(Long.valueOf(page));
107 pages.put(page, p = new Page());
108 p.setCell(offset, b);
111 public BitVector getCell(long address)
113 long page = address / pageSize;
114 int offset = (int) (address % pageSize);
115 Page p = pages.get(Long.valueOf(page));
117 return BitVector.of(Bit.U, cellWidth);
118 return p.getCell(offset);
123 private BitVector[] memory;
127 memory = new BitVector[pageSize];
130 public BitVector getCell(int index)
132 BitVector b = memory[index];
134 return BitVector.of(Bit.U, cellWidth);
135 return memory[index];
138 public void setCell(int index, BitVector bits)
140 if (bits.length() != cellWidth)
141 throw new IllegalArgumentException(
142 String.format("BitVector to be saved in memory cell has unexpected length. Expected: %d Actual: %d", cellWidth,
144 memory[index] = bits;
148 public String toString()
150 return Arrays.deepToString(memory);
155 //import java.math.BigInteger;
157 //import net.mograsim.logic.core.types.Bit;
158 //import net.mograsim.logic.core.types.BitVector;
160 //private byte[] encode(BitVector v)
162 // BigInteger d = BigInteger.ZERO;
163 // Bit[] bits = v.getBits();
164 // for (int i = v.length() - 1; i >= 0; i--)
166 // d = d.add(BigInteger.valueOf(bits[i].ordinal()));
167 // d = d.multiply(BigInteger.valueOf(Bit.values().length));
169 // return d.toByteArray();
175 // * @param numBits length of the resulting BitVector
178 //private BitVector decode(byte[] bytes, int numBits)
180 // BigInteger d = new BigInteger(bytes);
181 // Bit[] bits = new Bit[numBits];
182 // return BitVector.of(bits);
185 //private static class CellArray
187 // private byte[] bytes;
188 // private final static byte mask = -1;
189 // public CellArray(int numCells, int cellSize)
191 // bytes = new byte[numCells * cellSize / 8];
194 // public byte[] getCell(int i)