1
0
Эх сурвалжийг харах

Add registered links to OutState

Baglio Tabifata 5 жил өмнө
parent
commit
c6e326496c

+ 2 - 0
src/main/java/info/hkzlab/dupal/analyzer/palanalisys/graph/GraphLink.java

@@ -4,4 +4,6 @@ public interface GraphLink {
     public int getLinkInputs();
     public GraphState getSourceState();
     public GraphState getDestinationState();
+
+    public boolean isLongLink(); // If true, we will require a "clock" pulse to perform a long jump
 }

+ 5 - 0
src/main/java/info/hkzlab/dupal/analyzer/palanalisys/graph/OutLink.java

@@ -55,4 +55,9 @@ public class OutLink implements GraphLink {
     public GraphState getDestinationState() {
         return dest;
     }
+
+    @Override
+    public boolean isLongLink() {
+        return false;
+    }
 }

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

@@ -4,21 +4,29 @@ import info.hkzlab.dupal.analyzer.exceptions.DuPALAnalyzerException;
 
 public class OutState implements GraphState {
     public final OutStatePins pins;
-    private final OutLink[] links;
+    private final OutLink[] outLinks;
+    private final RegLink[] regLinks;
 
     private int lastOutLinkIdx;
+    private int lastRegLinkIdx;
 
     public OutState(OutStatePins pins, int maxLinks) {
+        this(pins, maxLinks, 0);
+    }
+
+    public OutState(OutStatePins pins, int maxLinks, int maxRegLinks) {
         this.pins = pins;
-        links = new OutLink[maxLinks];
+        outLinks = new OutLink[maxLinks];
+        regLinks = new RegLink[maxRegLinks];
 
         lastOutLinkIdx = 0;
+        lastRegLinkIdx = 0;
     }
 
     public int addOutLink(OutLink link) throws DuPALAnalyzerException {
         int idx = lastOutLinkIdx;
 
-        if(idx >= links.length) throw new DuPALAnalyzerException("Tried to insert a link above maximum possible for this State " + this.toString());
+        if(idx >= outLinks.length) throw new DuPALAnalyzerException("Tried to insert a link above maximum possible for this State " + this.toString());
 
         lastOutLinkIdx++;
 
@@ -27,17 +35,37 @@ public class OutState implements GraphState {
         return idx;
     }
 
-    public int getMaxLinks() {
-        return links.length;
+    
+    public int addRegLink(RegLink link) throws DuPALAnalyzerException {
+        int idx = lastRegLinkIdx;
+
+        if(idx >= regLinks.length) throw new DuPALAnalyzerException("Tried to insert a registered link above maximum possible for this State " + this.toString());
+
+        lastRegLinkIdx++;
+
+        setRegLinkAtIdx(link, idx);
+
+        return idx;
     }
 
     public int getNextLinkIdx() {
         return lastOutLinkIdx;
     }
 
+    public int getNextRegLinkIdx() {
+        return lastRegLinkIdx;
+    }
+
     private boolean setOutLinkAtIdx(OutLink link, int idx) {
-        if(links[idx] != null) return false;
-        links[idx] = link;
+        if(outLinks[idx] != null) return false;
+        outLinks[idx] = link;
+
+        return true;
+    }
+
+    private boolean setRegLinkAtIdx(RegLink link, int idx) {
+        if(regLinks[idx] != null) return false;
+        regLinks[idx] = link;
 
         return true;
     }
@@ -47,7 +75,8 @@ public class OutState implements GraphState {
         int hash = 7;
 
         hash = hash*31 + pins.hashCode();
-        hash = hash*31 + links.length;
+        hash = hash*31 + outLinks.length;
+        hash = hash*31 + regLinks.length;
 
         return hash;
     }
@@ -76,11 +105,16 @@ public class OutState implements GraphState {
 
     @Override
     public boolean isStateFull() {
-        return links.length == lastOutLinkIdx;
+        return  (outLinks.length == lastOutLinkIdx) &&
+                (regLinks.length == lastRegLinkIdx);
     }
 
     @Override
     public GraphLink[] getLinks() {
-        return links;
+        GraphLink[] linkArray = new GraphLink[outLinks.length + regLinks.length];
+        System.arraycopy(outLinks, 0, linkArray, 0, outLinks.length);
+        System.arraycopy(regLinks, 0, linkArray, outLinks.length, regLinks.length);
+
+        return linkArray;
     }
 }

+ 1 - 1
src/main/java/info/hkzlab/dupal/analyzer/palanalisys/graph/PathFinder.java

@@ -25,7 +25,7 @@ public class PathFinder {
        
            GraphLink[] stateLinks = currentState.getLinks(); // Get links present in the current state
 
-            for(GraphLink l : stateLinks) { // For evey link...
+            for(GraphLink l : stateLinks) { // For every link...
                 if(!pathMap.containsKey(l.getDestinationState().hashCode())) { // If it's not leading somewhere we've already visited or we've already put in our path map
                     ArrayList<GraphLink> statePath = (ArrayList<GraphLink>)linkStack.clone(); // Copy the map to the current state
                     statePath.add(l); // And append this link to it

+ 5 - 0
src/main/java/info/hkzlab/dupal/analyzer/palanalisys/graph/RegLink.java

@@ -62,5 +62,10 @@ public class RegLink implements GraphLink {
     public GraphState getDestinationState() {
         return dest;
     }
+
+    @Override
+    public boolean isLongLink() {
+        return true;
+    }
     
 }