Prechádzať zdrojové kódy

Rework the macrostate to use a better pin index

Baglio Tabifata 4 rokov pred
rodič
commit
472ad4dd62

+ 1 - 0
src/net/hkzlab/dupal/boardio/DuPALAnalyzer.java

@@ -94,6 +94,7 @@ public class DuPALAnalyzer {
         logger.info("Output states at start: " + Integer.toBinaryString(pins & IOasOUT_Mask) + "b");
 
         mstate_idx = routstate >> pspecs.getROUT_READMaskShift();
+        MacroState ms = new MacroState(buildMSTag(mstate_idx), mstate_idx, pspecs.getNumROUTPins(), pspecs.getNumINPins());
     }
 
     private int readPINs() {

+ 8 - 12
src/net/hkzlab/palanalisys/MacroState.java

@@ -7,15 +7,17 @@ public class MacroState {
     public static final String MS_PRE_TAG = "MS_";
 
     public final String tag;
-    public final boolean[] rpin_status;
+    public final int rpins;
+    public final int rpin_status;
 
     public final SubState[] substates;
     public final StateLink[] links;
     public final HashMap<Integer, SubState> ssMap;
 
-    public MacroState(final String tag, final boolean[] rpin_status, final int outPins, final int inPins) {
+    public MacroState(final String tag, final int rpin_status, final int rpins, final int inPins) {
         this.tag = tag;
         this.rpin_status = rpin_status;
+        this.rpins = rpins;
 
         links = new StateLink[2 ^ inPins]; // Create space for the future links out of this
         substates = new SubState[2 ^ inPins]; // Create space for substates (each output pin is 3-state, but as they're triggered via input changes, we can have at most 2^inPins)
@@ -24,21 +26,15 @@ public class MacroState {
 
     @Override
     public String toString() {
-        final StringBuffer strBuf = new StringBuffer();
-        strBuf.append(MS_PRE_TAG + tag + " - ");
-
-        for (final boolean rpin : rpin_status)
-            strBuf.append(rpin ? '1' : '0');
-
-        return strBuf.toString();
+        return MS_PRE_TAG + tag + " - " + Integer.toBinaryString(rpin_status);
     }
 
     @Override
     public int hashCode() {
         int hash = 0;
 
-        for (int idx = 0; idx < rpin_status.length; idx++) {
-            hash ^= ((rpin_status[idx] ? 1 : 0) << (idx % 32));
+        for (int idx = 0; idx < (2^rpins); idx++) {
+            hash ^= (((rpin_status >> idx) & 0x01) << (idx % 32));
         }
 
         return hash ^ tag.hashCode();
@@ -54,8 +50,8 @@ public class MacroState {
             return false;
 
         final MacroState ops = (MacroState) o;
+        if(ops.rpin_status != this.rpin_status) return false;
         if(!ops.tag.equals(this.tag)) return false;
-        if(!Arrays.equals(ops.rpin_status, this.rpin_status)) return false;
 
         return true;
     }