Ver código fonte

Change registered links for a state must be equal in number to outlinks

Baglio Tabifata 4 anos atrás
pai
commit
bbbc8b51a3

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

@@ -34,8 +34,9 @@ public class OSExplorer {
                 if(linkPath != null && linkPath.length > 0) {
                     for(GraphLink l : linkPath) {
                         logger.info("exploreOutStates() -> Walking link " + l);
-                        if(l.isFarLink()) dpci.writeAndPulseClock(l.getLinkInputs());
-                        else dpci.write(l.getLinkInputs()); // Walk the path to the new state
+                        // Now let's walk the path, with proper actions depending on the type of link
+                        if(l.isFarLink()) dpci.writeAndPulseClock(l.getLinkInputs()); 
+                        else dpci.write(l.getLinkInputs()); 
                     }
                     curState = (OutState) (linkPath[linkPath.length-1].getDestinationState());
                     logger.info("exploreOutStates() -> walked path to state " + curState);
@@ -119,7 +120,7 @@ public class OSExplorer {
         }
 
         OutStatePins osp = extractOutPinStates(pSpecs, ioAsOutMask, pinState_A, pinState_B);
-        OutState os = new OutState(osp, maxLinks);
+        OutState os = new OutState(osp, maxLinks, (pSpecs.getPinCount_RO() > 0));
 
         // Check if we already visited this state, in which case, recover that state, otherwise save the state in the map
         if(statesMap.containsKey(os.hashCode())) os = statesMap.get(os.hashCode());

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

@@ -10,14 +10,14 @@ public class OutState implements GraphState {
     private int lastOutLinkIdx;
     private int lastRegLinkIdx;
 
-    public OutState(OutStatePins pins, int maxLinks) {
-        this(pins, maxLinks, 0);
+    public OutState(final OutStatePins pins, final int maxLinks) {
+        this(pins, maxLinks, false);
     }
 
-    public OutState(OutStatePins pins, int maxLinks, int maxRegLinks) {
+    public OutState(final OutStatePins pins, final int maxLinks, final boolean addRegLinks) {
         this.pins = pins;
         outLinks = new OutLink[maxLinks];
-        regLinks = new RegLink[maxRegLinks];
+        regLinks = new RegLink[addRegLinks ? maxLinks : 0];
 
         lastOutLinkIdx = 0;
         lastRegLinkIdx = 0;

+ 6 - 5
src/test/java/info/hkzlab/dupal/analyzer/PathFinderTest.java

@@ -49,8 +49,8 @@ public class PathFinderTest {
         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, 1);
-        OutState os_f = new OutState(new OutStatePins(0x05, 0x00), 3, 1);
+        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));
@@ -71,15 +71,16 @@ public class PathFinderTest {
         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, 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);
-        for(GraphLink p : path) System.out.println(p);
-        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, 0x20) }; // a->b->e=>f
+        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);
     }