java/ch/wlkl/processor/Memory.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package ch.wlkl.processor;
/**
*
* @author walter
*/
public class Memory {
public static int a2i(Gate[] arr) {
int r = 0;
int pot = 1;
for (int a = 0; a < arr.length; a++) {
if (arr[a].get())
r += pot;
pot *= 2;
}
return r;
}
public static void i2a(int v, Gate[] arr) {
int rest = v;
for (int a = 0; a < arr.length; a++) {
arr[a].set(rest % 2 == 1);
rest /= 2;
}
}
public final GateOr iSet;
public final GateInL [] adr, iVal, out;
public final Store[][] store;
public Memory(int aSz, int wSz) {
iSet = new GateOr();
adr = new GateOr[aSz];
for (int a = 0; a < aSz; a++) {
adr[a] = new GateOr();
}
iVal = new GateOr[wSz];
out = new GateOr[wSz];
for (int s = 0; s < wSz; s++) {
iVal[s] = new GateOr();
out[s] = new GateOr();
}
final int wrds = 1 << aSz;
store = new Store[wrds][wSz];
build(aSz-2, 0, new GateNot(adr[aSz-1]));
build(aSz-2, wrds/2, adr[aSz-1]);
}
private void build(int ax, int from, Gate gAdr) {
// System.out.println("build(" + ax + ", " + from + ".......... 2 ^ ax" + (1 << ax));
if (ax >= 0) {
build(ax-1, from, new GateAnd(gAdr, new GateNot(adr[ax])));
build(ax-1, from + (1 << ax), new GateAnd(gAdr, adr[ax]));
} else {
GateAnd gSet = new GateAnd(iSet, gAdr);
for (int s = 0; s < out.length; s++) {
store[from][s] = new Store("m" + from + "#" + s, gSet, iVal[s]);
out[s].addIn(new GateAnd(gAdr, store[from][s]));
}
}
}
public void setAdr(int aAdr) {
int rest = aAdr;
for (int a = 0; a < adr.length; a++) {
adr[a].set(rest % 2 == 1);
rest = rest / 2;
}
}
public int getWord(int aAdr) {
setAdr(aAdr);
return a2i(out);
}
public void setWord(int aAdr, int v) {
setAdr(aAdr);
i2a(v, iVal);
iSet.set(true);
iSet.set(false);
}
}