1
0
Baglio Tabifata 5 жил өмнө
parent
commit
dc34c892de

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

@@ -23,6 +23,8 @@ public class OutStatePadder {
     static public OutState[] padUnknownOutStates(OutState[] states, PALSpecs pSpecs, int ioAsOutMask)
     static public OutState[] padUnknownOutStates(OutState[] states, PALSpecs pSpecs, int ioAsOutMask)
             throws DuPALAnalyzerException {
             throws DuPALAnalyzerException {
         int ioAsOut_W = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, pSpecs.getMask_IO_R()), pSpecs.getMask_IO_W());
         int ioAsOut_W = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, pSpecs.getMask_IO_R()), pSpecs.getMask_IO_W());
+        int ioAsOutPins = BitUtils.countBits(ioAsOutMask);
+
         ArrayList<OutState> statesList = new ArrayList<>();
         ArrayList<OutState> statesList = new ArrayList<>();
         ArrayList<OutState> outList = new ArrayList<>();
         ArrayList<OutState> outList = new ArrayList<>();
         statesList.addAll(Arrays.asList(states));
         statesList.addAll(Arrays.asList(states));
@@ -48,6 +50,16 @@ public class OutStatePadder {
             curIOIdx = osIdx+1;
             curIOIdx = osIdx+1;
         }
         }
 
 
+        for(int idx = curIOIdx; idx < (1 << ioAsOutPins); idx++) {
+            OutState padOS = new OutState(new OutStatePins(BitUtils.scatterBitField(idx, ioAsOutMask), 0), states[0].getOutLinks().length, states[0].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() -> end padding with state " + padOS);           
+        }
+
         return outList.toArray(new OutState[outList.size()]);
         return outList.toArray(new OutState[outList.size()]);
     }
     }
 }
 }

+ 146 - 0
src/test/java/info/hkzlab/dupal/analyzer/OutStatePadderTest.java

@@ -0,0 +1,146 @@
+package info.hkzlab.dupal.analyzer;
+
+import static org.junit.Assert.*;
+
+
+import org.junit.Test;
+
+import info.hkzlab.dupal.analyzer.devices.PAL16L8Specs;
+import info.hkzlab.dupal.analyzer.exceptions.DuPALAnalyzerException;
+import info.hkzlab.dupal.analyzer.palanalisys.graph.*;
+import info.hkzlab.dupal.analyzer.palanalisys.padding.OutStatePadder;
+
+public class OutStatePadderTest {
+    @Test
+    public void PathFinderShouldProvideShortestPathToDestination() throws DuPALAnalyzerException {
+        OutState os_a = new OutState(new OutStatePins(0x00, 0x00), 3);
+        OutState os_b = new OutState(new OutStatePins(0x04, 0x00), 3);
+        OutState os_c = new OutState(new OutStatePins(0x06, 0x00), 3);
+
+        os_a.addOutLink(new OutLink(os_a, os_a, 0x10));
+        os_a.addOutLink(new OutLink(os_a, os_b, 0x20));
+        os_a.addOutLink(new OutLink(os_a, os_c, 0x30));
+
+        os_b.addOutLink(new OutLink(os_b, os_a, 0x10));
+        os_b.addOutLink(new OutLink(os_b, os_b, 0x20));
+        os_b.addOutLink(new OutLink(os_b, os_c, 0x30));
+        
+        os_c.addOutLink(new OutLink(os_c, os_a, 0x10));
+        os_c.addOutLink(new OutLink(os_c, os_b, 0x20));
+        os_c.addOutLink(new OutLink(os_c, os_b, 0x30));
+
+        OutState[] osArr = new OutState[] { os_a, os_b, os_c};
+        OutState[] padOsArr = OutStatePadder.padUnknownOutStates(osArr, new PAL16L8Specs(), 0x3F);
+       
+        assertEquals("OutStates array should be padded to full length", 0x40, padOsArr.length);
+    }
+
+    @Test
+    public void PathFinderShouldProvideShortestPathToDestinationWithRegLinks() throws DuPALAnalyzerException {
+        OutState os_a = new OutState(new OutStatePins(0x00, 0x00), 3);
+        OutState os_b = new OutState(new OutStatePins(0x01, 0x00), 3);
+        OutState os_c = new OutState(new OutStatePins(0x02, 0x00), 3);
+        OutState os_d = new OutState(new OutStatePins(0x03, 0x00), 3);
+        OutState os_e = new OutState(new OutStatePins(0x04, 0x00), 3, true);
+        OutState os_f = new OutState(new OutStatePins(0x05, 0x00), 3, true);
+
+        os_a.addOutLink(new OutLink(os_a, os_a, 0x10));
+        os_a.addOutLink(new OutLink(os_a, os_b, 0x20));
+        os_a.addOutLink(new OutLink(os_a, os_c, 0x30));
+
+        os_b.addOutLink(new OutLink(os_b, os_a, 0x10));
+        os_b.addOutLink(new OutLink(os_b, os_e, 0x20));
+        os_b.addOutLink(new OutLink(os_b, os_d, 0x30));
+        
+        os_c.addOutLink(new OutLink(os_c, os_a, 0x10));
+        os_c.addOutLink(new OutLink(os_c, os_b, 0x20));
+        os_c.addOutLink(new OutLink(os_c, os_d, 0x30));
+        
+        os_d.addOutLink(new OutLink(os_d, os_c, 0x10));
+        os_d.addOutLink(new OutLink(os_d, os_b, 0x20));
+        os_d.addOutLink(new OutLink(os_d, os_e, 0x30));
+
+        os_e.addOutLink(new OutLink(os_e, os_a, 0x10));
+        os_e.addOutLink(new OutLink(os_e, os_d, 0x20));
+        os_e.addOutLink(new OutLink(os_e, os_e, 0x20));
+        os_e.addRegLink(new RegLink(os_e, os_e, os_f, 0x10));
+        os_e.addRegLink(new RegLink(os_e, os_e, os_e, 0x20));
+        os_e.addRegLink(new RegLink(os_e, os_e, os_e, 0x30));
+        
+        os_f.addOutLink(new OutLink(os_f, os_f, 0x10));
+        os_f.addOutLink(new OutLink(os_f, os_f, 0x20));
+        os_f.addRegLink(new RegLink(os_f, os_f, os_a, 0x20));
+
+        GraphLink[] path = PathFinder.findPathToNearestUnfilledState(os_a);
+        GraphLink[] expectedPath = new GraphLink[] { new OutLink(os_a, os_b, 0x20), new OutLink(os_b, os_e, 0x20), new RegLink(os_e, os_e, os_f, 0x10) }; // a->b->e=>f
+
+        assertArrayEquals("PathFinder should find the shortest path between a node and an incomplete one even if regLinks are involved", expectedPath, path);
+    }
+
+
+    @Test
+    public void PathFinderShouldProvideNoPathIfAllNodesAreComplete() throws DuPALAnalyzerException {
+        OutState os_a = new OutState(new OutStatePins(0x00, 0x00), 3);
+        OutState os_b = new OutState(new OutStatePins(0x01, 0x00), 3);
+        OutState os_c = new OutState(new OutStatePins(0x02, 0x00), 3);
+        OutState os_d = new OutState(new OutStatePins(0x03, 0x00), 3);
+        OutState os_e = new OutState(new OutStatePins(0x04, 0x00), 3);
+
+        os_a.addOutLink(new OutLink(os_a, os_a, 0x10));
+        os_a.addOutLink(new OutLink(os_a, os_b, 0x20));
+        os_a.addOutLink(new OutLink(os_a, os_c, 0x30));
+
+        os_b.addOutLink(new OutLink(os_b, os_a, 0x10));
+        os_b.addOutLink(new OutLink(os_b, os_e, 0x20));
+        os_b.addOutLink(new OutLink(os_b, os_d, 0x30));
+        
+        os_c.addOutLink(new OutLink(os_c, os_a, 0x10));
+        os_c.addOutLink(new OutLink(os_c, os_b, 0x20));
+        os_c.addOutLink(new OutLink(os_c, os_d, 0x30));
+        
+        os_d.addOutLink(new OutLink(os_d, os_c, 0x10));
+        os_d.addOutLink(new OutLink(os_d, os_b, 0x20));
+        os_d.addOutLink(new OutLink(os_d, os_e, 0x30));
+
+        os_e.addOutLink(new OutLink(os_e, os_a, 0x10));
+        os_e.addOutLink(new OutLink(os_e, os_d, 0x20));
+        os_e.addOutLink(new OutLink(os_e, os_e, 0x20));
+
+        GraphLink[] path = PathFinder.findPathToNearestUnfilledState(os_a);
+        
+        assertArrayEquals("PathFinder should return null if no incomplete node exists", null, path);
+    }
+
+    @Test
+    public void PathFinderShouldProvideShortestPathBetweenStates() throws DuPALAnalyzerException {
+        OutState os_a = new OutState(new OutStatePins(0x00, 0x00), 3);
+        OutState os_b = new OutState(new OutStatePins(0x01, 0x00), 3);
+        OutState os_c = new OutState(new OutStatePins(0x02, 0x00), 3);
+        OutState os_d = new OutState(new OutStatePins(0x03, 0x00), 3);
+        OutState os_e = new OutState(new OutStatePins(0x04, 0x00), 3);
+
+        os_a.addOutLink(new OutLink(os_a, os_a, 0x10));
+        os_a.addOutLink(new OutLink(os_a, os_b, 0x20));
+        os_a.addOutLink(new OutLink(os_a, os_c, 0x30));
+
+        os_b.addOutLink(new OutLink(os_b, os_a, 0x10));
+        os_b.addOutLink(new OutLink(os_b, os_e, 0x20));
+        os_b.addOutLink(new OutLink(os_b, os_d, 0x30));
+        
+        os_c.addOutLink(new OutLink(os_c, os_a, 0x10));
+        os_c.addOutLink(new OutLink(os_c, os_b, 0x20));
+        os_c.addOutLink(new OutLink(os_c, os_d, 0x30));
+        
+        os_d.addOutLink(new OutLink(os_d, os_c, 0x10));
+        os_d.addOutLink(new OutLink(os_d, os_b, 0x20));
+        os_d.addOutLink(new OutLink(os_d, os_e, 0x30));
+
+        os_e.addOutLink(new OutLink(os_e, os_a, 0x10));
+        os_e.addOutLink(new OutLink(os_e, os_d, 0x20));
+        os_e.addOutLink(new OutLink(os_e, os_e, 0x20));
+
+        GraphLink[] path = PathFinder.findPathToState(os_b, os_c);
+        
+        assertEquals("PathFinder should find shortest path between two states", 2, path.length);
+    }
+}