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);
    }
    

}