new Slipway().dumpFabric(false);
}
- public Slipway() { this("valentine.bit"); }
+ public Slipway() { this("groundhog2.bit"); }
public Slipway(String bitfile) {
this.bitfile = bitfile;
createShip("Debug", "debug");
createShip("Alu2", "alu2a");
createShip("Alu2", "alu2b");
- //createShip("Alu2", "alu2c");
- //createShip("Alu2", "alu2d");
- createShip("Execute", "execute");
+ createShip("Alu2", "alu2c");
+ createShip("Alu2", "alu2d");
createShip("Fifo", "fifo1");
createShip("Fifo", "fifo2");
- //createShip("Fifo", "fifo3");
- //createShip("Fifo", "fifo4");
+ createShip("Fifo", "fifo3");
+ createShip("Fifo", "fifo4");
+ createShip("Execute", "execute");
+ createShip("Memory", "Memory");
createShip("Memory", "Memory");
- //createShip("Memory", "Memory");
createShip("Lut3", "lut3");
createShip("Alu1", "alu1");
+ createShip("Alu3", "alu3");
createShip("Choice", "Choice");
createShip("Choice", "Choice");
createShip("Choice", "Choice");
createShip("Choice", "Choice");
+ createShip("Stack", "Stack");
dumpFabric(true);
}
} else if (prefix.equals("dest")) {
p.addr = addr;
p.bits = bits;
- int count = 1;
+ if (bits >= 11)
+ throw new RuntimeException("too many benkoboxen!");
+ int count = 0;
for(Destination d : p.getDestinations()) {
if (!(d instanceof SlipwayBenkoBox.VirtualPort)) continue;
SlipwayBenkoBox.VirtualPort vp = (SlipwayBenkoBox.VirtualPort)d;
- vp.addr = p.addr | (count << (bits+1));
+ vp.addr = p.addr | (count << bits);
count++;
}
}
return p;
}
int len = end-start;
+ int count = 0;
+ int count2 = 0;
+ int breakpt = 0;
+ if (end-start <= 2) {
+ breakpt = (start+end)/2;
+ } else {
+ for(int i=start; i<end; i++)
+ count += count(ports[i].getDestinations());
+ for(int i=start; i<end-1; i++) {
+ count2 += count(ports[i].getDestinations());
+ breakpt = i;
+ if (i>start && count2 >= count/2) break;
+ }
+ }
return new Node(name,
component,
- mkNode(name+"_0", component, ports, start, start+len/2, addr, bits+1),
- mkNode(name+"_1", component, ports, start+len/2, end, addr | (1 << bits), bits+1),
+ mkNode(name+"_0", component, ports, start, breakpt, addr, bits+1),
+ mkNode(name+"_1", component, ports, breakpt, end, addr | (1 << bits), bits+1),
addr,
bits);
}
return ship.getType() + ship.getOrdinal();
}
+ private static int count(Iterable<Destination> it) {
+ int ret = 0;
+ for(Destination d : it)
+ ret++;
+ return ret;
+ }
+
public void expand(ShipDescription sd) {
try {
String filename = sd.getName().toLowerCase();
FileOutputStream out = new FileOutputStream(outf);
PrintWriter pw = new PrintWriter(out);
- boolean auto = filename.equals("alu2") || filename.equals("alu1") || filename.equals("lut3");
+ boolean auto = filename.equals("alu2") || filename.equals("alu1") || filename.equals("lut3") || filename.equals("choice") || filename.equals("alu3") || filename.equals("stack");
if (auto) {
pw.println("`include \"macros.v\"");
pw.println();
bb_name+"_r, "+
bb_name+"_a, "+
bb_name+"_a_, "+
- "[(`DATAWIDTH-1):0],"+
+ "[(`PACKET_WIDTH-1):0],"+
bb_name+"_d)"
);
} else {
bb_name+"_r, "+
bb_name+"_r_, "+
bb_name+"_a, "+
- "[(`DATAWIDTH-1):0],"+
+ "[(`PACKET_WIDTH-1):0],"+
bb_name+"_d_)"
);
pw.println("`defreg(" +
bb_name+"_d_, "+
- "[(`DATAWIDTH-1):0],"+
+ "[(`PACKET_WIDTH-1):0],"+
bb_name+"_d)"
);
}
public void writeInstruction(DataOutputStream os, Instruction d) throws IOException { iie.writeInstruction(os, d); }
private class SlipwayInstructionEncoder extends InstructionEncoder {
- public long getDestAddr(Destination box) {
- long ret;
- if (box instanceof SlipwayBenkoBox)
- ret = ((SlipwayBenkoBox)box).addr;
- else
- ret = ((SlipwayBenkoBox.VirtualPort)box).addr;
- return ret;
- }
+ public long getDestAddr(Destination box) { return ((SlipwayBenkoBox.VirtualPort)box).addr; }
public long getBoxInstAddr(BenkoBox box) { return ((SlipwayBenkoBox)box).instr_addr; }
public Destination getDestByAddr(long dest) {
for(Ship ship : Slipway.this)
- for(BenkoBox bb : ship.getBenkoBoxes()) {
- if (((SlipwayBenkoBox)bb).addr == dest)
- return bb;
+ for(BenkoBox bb : ship.getBenkoBoxes())
for(Destination d : bb.getDestinations())
if (getDestAddr(d)==dest)
return d;
- }
return null;
}
public BenkoBox getBoxByInstAddr(long dest) {