Explorar o código

Wire up outstate padding

Baglio Tabifata %!s(int64=5) %!d(string=hai) anos
pai
achega
23c2337fcf

+ 2 - 0
src/main/java/info/hkzlab/dupal/analyzer/board/boardio/DuPALAnalyzer.java

@@ -12,6 +12,7 @@ import info.hkzlab.dupal.analyzer.palanalisys.explorers.OSExplorer;
 import info.hkzlab.dupal.analyzer.palanalisys.explorers.SimpleExplorer;
 import info.hkzlab.dupal.analyzer.palanalisys.formatter.EspressoFormatter;
 import info.hkzlab.dupal.analyzer.palanalisys.graph.OutState;
+import info.hkzlab.dupal.analyzer.palanalisys.padding.OutStatePadder;
 import info.hkzlab.dupal.analyzer.palanalisys.simple.SimpleState;
 import info.hkzlab.dupal.analyzer.utilities.BitUtils;
 
@@ -114,6 +115,7 @@ public class DuPALAnalyzer {
                 }
                 
                 OutState[] osArray = OSExplorer.exploreOutStates(dpci, ioAsOutMask);
+                osArray = OutStatePadder.padUnknownOutStates(osArray, dpci.palSpecs, ioAsOutMask);
                 header = EspressoFormatter.formatEspressoTableHeader(dpci.palSpecs, ioAsOutMask, ignoreFeedbacks);
                 table = EspressoFormatter.formatEspressoTable(dpci.palSpecs, ioAsOutMask, osArray, ignoreFeedbacks);
 

+ 1 - 5
src/main/java/info/hkzlab/dupal/analyzer/palanalisys/formatter/EspressoFormatter.java

@@ -1,7 +1,6 @@
 package info.hkzlab.dupal.analyzer.palanalisys.formatter;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashSet;
 
 import info.hkzlab.dupal.analyzer.devices.PALSpecs;
@@ -163,10 +162,7 @@ public class EspressoFormatter {
             }
         }
 
-        String[] table = tableRows.toArray(new String[tableRows.size()]);
-        Arrays.sort(table);
-
-        return table;
+        return tableRows.toArray(new String[tableRows.size()]);
     }
 
     public static String[] formatEspressoTable(PALSpecs pSpecs, SimpleState[] states) {

+ 25 - 0
src/main/java/info/hkzlab/dupal/analyzer/palanalisys/padding/OutStateIOOutComparator.java

@@ -0,0 +1,25 @@
+package info.hkzlab.dupal.analyzer.palanalisys.padding;
+
+import java.util.Comparator;
+
+import info.hkzlab.dupal.analyzer.palanalisys.graph.OutState;
+import info.hkzlab.dupal.analyzer.utilities.BitUtils;
+
+public class OutStateIOOutComparator implements Comparator<OutState> {
+    private final int ioAsOutMask;
+
+    public OutStateIOOutComparator(final int ioAsOutMask) {
+       this.ioAsOutMask = ioAsOutMask;
+    }
+
+    @Override
+    public int compare(OutState s1, OutState s2) {
+        int io1 = BitUtils.consolidateBitField(s1.pins.out, ioAsOutMask);
+        int io2 = BitUtils.consolidateBitField(s2.pins.out, ioAsOutMask);
+
+        if(io1 < io2) return -1;
+        else if (io1 > io2) return 1;
+        else return 0;
+    }
+    
+}

+ 53 - 0
src/main/java/info/hkzlab/dupal/analyzer/palanalisys/padding/OutStatePadder.java

@@ -0,0 +1,53 @@
+package info.hkzlab.dupal.analyzer.palanalisys.padding;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.hkzlab.dupal.analyzer.devices.PALSpecs;
+import info.hkzlab.dupal.analyzer.exceptions.DuPALAnalyzerException;
+import info.hkzlab.dupal.analyzer.palanalisys.graph.OutLink;
+import info.hkzlab.dupal.analyzer.palanalisys.graph.OutState;
+import info.hkzlab.dupal.analyzer.palanalisys.graph.OutStatePins;
+import info.hkzlab.dupal.analyzer.palanalisys.graph.RegLink;
+import info.hkzlab.dupal.analyzer.utilities.BitUtils;
+
+public class OutStatePadder {
+    private static final Logger logger = LoggerFactory.getLogger(OutStatePadder.class);
+
+    private OutStatePadder() {};
+
+    static public OutState[] padUnknownOutStates(OutState[] states, PALSpecs pSpecs, int ioAsOutMask)
+            throws DuPALAnalyzerException {
+        int ioAsOut_W = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, pSpecs.getMask_IO_R()), pSpecs.getMask_IO_W());
+        ArrayList<OutState> statesList = new ArrayList<>();
+        ArrayList<OutState> outList = new ArrayList<>();
+        statesList.addAll(Arrays.asList(states));
+        Collections.sort(statesList, new OutStateIOOutComparator(ioAsOutMask));
+
+        OutState zeroOutState = new OutState(new OutStatePins(0, 0), 0, false);
+
+        int curIOIdx = 0;
+        for(OutState os : statesList) {
+            int osIdx = BitUtils.consolidateBitField(os.pins.out, ioAsOutMask);
+
+            for(int idx = curIOIdx; idx < osIdx; idx++) {
+                OutState padOS = new OutState(new OutStatePins(BitUtils.scatterBitField(idx, ioAsOutMask), 0), os.getOutLinks().length, os.getRegLinks().length > 0);
+
+                for(int link_idx = 0; link_idx < padOS.getOutLinks().length; link_idx++) padOS.addOutLink(new OutLink(padOS, zeroOutState, BitUtils.scatterBitField(link_idx, pSpecs.getMask_IN() | (pSpecs.getMask_IO_W() & ~ioAsOut_W))));
+                for(int link_idx = 0; link_idx < padOS.getRegLinks().length; link_idx++) padOS.addRegLink(new RegLink(padOS, padOS, zeroOutState, BitUtils.scatterBitField(link_idx, pSpecs.getMask_IN() | (pSpecs.getMask_IO_W() & ~ioAsOut_W))));
+
+                outList.add(padOS);
+                logger.info("padUnknownOutStates() -> pad with state " + padOS);
+            }
+            outList.add(os);
+
+            curIOIdx = osIdx+1;
+        }
+
+        return outList.toArray(new OutState[outList.size()]);
+    }
+}