소스 검색

Begin implementing OS explorer

Fabio Battaglia 5 년 전
부모
커밋
dffb9e36bc

+ 28 - 4
src/main/java/info/hkzlab/dupal/analyzer/palanalisys/explorers/OSExplorer.java

@@ -1,13 +1,37 @@
 package info.hkzlab.dupal.analyzer.palanalisys.explorers;
 
 import info.hkzlab.dupal.analyzer.board.boardio.DuPALCmdInterface;
+import info.hkzlab.dupal.analyzer.devices.PALSpecs;
 import info.hkzlab.dupal.analyzer.exceptions.DuPALBoardException;
+import info.hkzlab.dupal.analyzer.palanalisys.graph.OutState;
+import info.hkzlab.dupal.analyzer.palanalisys.graph.OutStatePins;
+import info.hkzlab.dupal.analyzer.utilities.BitUtils;
 
 public class OSExplorer {
-    private OSExplorer() {
-    };
+    private OSExplorer() {};
 
-public static void exploreOutStates(final DuPALCmdInterface dpci) throws DuPALBoardException {
-        dpci.write(0); // Set the status to 0
+    public static void exploreOutStates(final DuPALCmdInterface dpci, int ioAsOutMask) throws DuPALBoardException {
+        PALSpecs pSpecs = dpci.palSpecs;
+        int maxLinks = 1 << (pSpecs.getPinCount_IN() + (pSpecs.getPinCount_IO()-BitUtils.countBits(ioAsOutMask)));
+        int ioAsOut_W = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, pSpecs.getMask_IO_R()), pSpecs.getMask_IO_W());
+        int pinState_A, pinState_B;
+        OutStatePins osp;
+
+        dpci.write(0); // Set every input pin (and I/Os too) to low
+        pinState_A = dpci.read();
+        dpci.write(pSpecs.getMask_O_W() | ioAsOut_W);
+        pinState_B = dpci.read();
+        osp = extractOutPinStates(pSpecs, ioAsOutMask, pinState_A, pinState_B);
+
+        new OutState(osp, maxLinks);
+    }
+
+    private static OutStatePins extractOutPinStates(PALSpecs pSpecs, int ioAsOutMask, int read_a, int read_b) {
+        int out, hiz;
+
+        hiz = (read_a ^ read_b) & (ioAsOutMask | pSpecs.getMask_O_R());
+        out = (read_a & (ioAsOutMask | pSpecs.getMask_O_R())) & ~hiz;
+
+        return new OutStatePins(out, hiz);
     }
 }

+ 6 - 14
src/main/java/info/hkzlab/dupal/analyzer/palanalisys/graph/OutState.java

@@ -3,26 +3,18 @@ package info.hkzlab.dupal.analyzer.palanalisys.graph;
 import java.util.Arrays;
 
 public class OutState {
-    public final static int IDX_O = 0;
-    public final static int IDX_IO = 1;
-    public final static int IDX_HIZ = 2;
-
-    private final int[] status;
+    public final OutStatePins pins;
     private final OutLink[] links;
 
     private int lastOutLinkIdx;
 
-    public OutState(int o_state, int io_state, int hiz_state, int maxLinks) {
-        status = new int[]{o_state, io_state, hiz_state};
+    public OutState(OutStatePins pins, int maxLinks) {
+        this.pins = pins;
         links = new OutLink[maxLinks];
 
         lastOutLinkIdx = 0;
     }
 
-    public int[] getStatus() {
-        return status.clone();
-    }
-
     public OutLink getOutLinkAtIdx(int idx) {
         return links[idx];
     }
@@ -51,14 +43,14 @@ public class OutState {
     public int hashCode() {
         int hash = 7;
 
-        for(int s : status) hash = hash*31 + s;
+        hash = pins.hashCode()*31 + links.length;
 
         return hash;
     }
 
     @Override
     public String toString() {
-        return "OS["+String.format("%08X", status[0])+"|"+String.format("%08X", status[1])+"|"+String.format("%08X", status[2])+"]";
+        return "OS["+String.format("%08X", pins.out)+"|"+String.format("%08X", pins.hiz)+"]";
     }
 
     @Override
@@ -70,6 +62,6 @@ public class OutState {
         if (this.getClass() != o.getClass())
             return false;
 
-        return Arrays.equals(this.status, ((OutState) o).getStatus());
+        return this.pins.equals(((OutState)o).pins);
     }
 }

+ 35 - 0
src/main/java/info/hkzlab/dupal/analyzer/palanalisys/graph/OutStatePins.java

@@ -0,0 +1,35 @@
+package info.hkzlab.dupal.analyzer.palanalisys.graph;
+
+public class OutStatePins {
+    public final int out;
+    public final int hiz;
+
+    public OutStatePins(int out, int hiz) {
+        this.out = out;
+        this.hiz = hiz;
+    }
+
+    
+    @Override
+    public int hashCode() {
+        int hash = 7;
+
+        hash = hash*31+out;
+        hash = hash*31+hiz;
+
+        return hash;
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o)
+            return true;
+        if (o == null)
+            return false;
+        if (this.getClass() != o.getClass())
+            return false;
+
+        return (this.hiz == ((OutStatePins)o).hiz) &&
+               (this.out == ((OutStatePins)o).out);
+    }
+}