this.predicate = predicate;
}
+ //public abstract Instruction withLooping(boolean newLooping);
+ //public abstract Instruction withPredicate(Predicate newPredicate);
+
public String toString() {
String s = predicate.toString();
if (s.length()>0) s = "["+s+"] ";
- return s+dock+": ";
+ if (looping) s += "[L] ";
+ return dock+": "+s;
}
/**
/** if <tt>source</tt> is <tt>Immediate</tt>, this is the immediate value; an integer */
public final long immediate;
- /** if <tt>source</tt> is <tt>ImmediatePath</tt>, this is the immediate path */
- public final Path path;
-
/** if <tt>dest</tt> is <tt>Flags</tt>, this is the truth table to update flag "a" */
public final FlagFunction newFlagA;
public final FlagFunction newFlagB;
/** basic constructor */
+ public Set(Dock dock, SetDest dest, SetSource source) { this(dock, false, Predicate.Default, dest, source); }
public Set(Dock dock, boolean looping, Predicate predicate, SetDest dest, SetSource source) {
super(dock, looping, predicate);
OUTER: switch(dest) {
this.source = source;
this.dest = dest;
this.immediate = 0;
- this.path = null;
this.newFlagA = null;
this.newFlagB = null;
}
/** constructor for set instructions with immediates */
+ public Set(Dock dock, SetDest dest, long immediate) { this(dock, false, Predicate.Default, dest, immediate); }
public Set(Dock dock, boolean looping, Predicate predicate, SetDest dest, long immediate) {
super(dock, looping, predicate);
if (dest!=SetDest.InnerLoopCounter && dest!=SetDest.OuterLoopCounter && dest!=SetDest.DataLatch)
this.source = SetSource.Immediate;
this.dest = dest;
this.immediate = immediate;
- this.path = null;
- this.newFlagA = null;
- this.newFlagB = null;
- }
-
- /** constructor for set instructions with immediate paths */
- public Set(Dock dock, boolean looping, Predicate predicate, SetDest dest, Path path) {
- super(dock, looping, predicate);
- if (dest!=SetDest.TAPL)
- throw new RuntimeException("a set instruction with dest="+dest+" may not take an immediate path");
- this.source = SetSource.ImmediatePath;
- this.dest = dest;
- this.immediate = 0;
- this.path = path;
this.newFlagA = null;
this.newFlagB = null;
}
/** constructor for <tt>set flags</tt> instructions */
+ public Set(Dock dock, FlagFunction newFlagA, FlagFunction newFlagB) { this(dock, false, Predicate.Default, newFlagA, newFlagB); }
public Set(Dock dock, boolean looping, Predicate predicate, FlagFunction newFlagA, FlagFunction newFlagB) {
super(dock, looping, predicate);
this.source = SetSource.Immediate;
this.dest = SetDest.Flags;
this.immediate = 0;
- this.path = null;
this.newFlagA = newFlagA;
this.newFlagB = newFlagB;
}
/** possible sources for the Set instruction */
public static enum SetSource {
- Infinity, DataLatch, Immediate, ImmediatePath, Decrement;
+ Infinity, DataLatch, Immediate, Decrement;
}
/** possible destinations for the Set instruction */
public static enum SetDest {
- InnerLoopCounter, OuterLoopCounter, TAPL, Flags, DataLatch;
+ InnerLoopCounter, OuterLoopCounter, Flags, DataLatch;
}
/**
switch(dest) {
case InnerLoopCounter:
switch(source) {
+ /*
case Infinity: return super.toString()+"set ilc=*";
case DataLatch: return super.toString()+"set ilc=data";
case Immediate: return super.toString()+"set ilc="+immediate;
+ */
+ case Infinity: return super.toString()+"load repeat counter with *;";
+ case DataLatch: return super.toString()+"set ilc=data";
+ case Immediate: return super.toString()+"load repeat counter with "+immediate+";";
}
case OuterLoopCounter:
switch(source) {
+ /*
case Decrement: return super.toString()+"set olc--";
case DataLatch: return super.toString()+"set olc=data";
case Immediate: return super.toString()+"set olc="+immediate;
+ */
+ case Decrement: return super.toString()+"decrement loop counter;";
+ case DataLatch: return super.toString()+"set olc=data;";
+ case Immediate: return super.toString()+"load loop counter with "+immediate+";";
}
- case TAPL: return super.toString()+"set tapl="+path;
case Flags: return super.toString()+"set flags a="+newFlagA+" b="+newFlagB;
- case DataLatch: return super.toString()+"set data="+immediate;
+ case DataLatch: return super.toString()+"literal "+immediate+";";
}
throw new Error("impossible");
}
/** shifts an immediate into the low-order bits of the data latch */
public static class Shift extends Instruction {
public final BitVector immediate;
+ public Shift(Dock dock, BitVector immediate) { this(dock, false, Predicate.Default, immediate); }
public Shift(Dock dock, boolean looping, Predicate predicate, BitVector immediate) {
super(dock, looping, predicate);
this.immediate = immediate;
public final boolean tokenOut;
public Move(Dock dock,
+ Path path,
+ boolean tokenIn,
+ boolean dataIn,
+ boolean latchData,
+ boolean latchPath,
+ boolean dataOut,
+ boolean tokenOut
+ ) {
+ this(dock, false, Predicate.Default, false, path, tokenIn, dataIn, latchData, latchPath, dataOut, tokenOut); }
+ public Move(Dock dock,
boolean looping,
Predicate predicate,
boolean interruptible,
StringBuffer ret = new StringBuffer();
if (tokenIn) ret.append(", wait");
if (dataIn) {
- if (latchPath) ret.append(dock.isInputDock() ? ", collect path" : ", recv path");
- if (latchData) ret.append(dock.isInputDock() ? ", collect" : ", recv");
+ if (latchPath) ret.append(!dock.isInputDock() ? ", collect path" : ", recv path");
+ if (latchData) ret.append(!dock.isInputDock() ? ", collect" : ", recv");
if (!latchPath && !latchData) ret.append(", discard");
}
if (dataOut && dock.isInputDock()) ret.append(", deliver");
- if (dataOut && !dock.isInputDock()) ret.append(path==null ? ", send" : "sendto " + path);
- if (tokenOut) ret.append(path==null ? ", token" : "tokento " + path);
+ if (dataOut && !dock.isInputDock()) ret.append(path==null ? ", send" : ", sendto " + path.getDestination().getDock());
+ if (tokenOut) ret.append(path==null ? ", token" : ", notify " + path.getDestination().getDock());
String s = ret.toString();
s = s.equals("") ? "nop" : s.substring(2);
if (interruptible) s = "[i] " + s;
- return super.toString()+s;
+ return super.toString()+s+";";
}
}