public static class LocalLiteral extends Executable {
public final long literal;
+ public final boolean high;
public boolean isRequeueing() { return true; }
- public LocalLiteral(Pump pump, long literal, int count) {
+ public LocalLiteral(Pump pump, long literal, int count, boolean high) {
super(pump, count);
this.literal = literal;
+ this.high = high;
}
public Instruction.Executable decrementCount() {
if (count==1) return null;
- return new LocalLiteral(pump, literal, count-1);
+ return new LocalLiteral(pump, literal, count-1, high);
}
}
import edu.berkeley.sbp.misc.*;
import edu.berkeley.sbp.meta.*;
import edu.berkeley.sbp.util.*;
+import static edu.berkeley.fleet.util.BitManipulations.*;
import java.util.*;
import java.io.*;
} else if ("massacre".equals(tt.head())) {
cb.add(new Instruction.Massacre(pump));
continue;
- } else if ("literal".equals(tt.head())) {
+ } else if ("literal".equals(tt.head())) {
long literal = 0;
if (tt.child(0).head().equals("CodeBagBody")) {
Tree<String> tq = tt;
} else if ("forever".equals(tt.child(1).head())) {
count = 0;
}
- cb.add(new Instruction.LocalLiteral(pump, literal, count));
+ cb.add(new Instruction.LocalLiteral(pump, getField(36, 19, literal), count, true));
+ cb.add(new Instruction.LocalLiteral(pump, getField(18, 0, literal), count, false));
continue;
}
Tree ttx = null;
new AssignAction(instruction_count_ondeck, repcount) }
);
- Assignable data_latch = new SimpleAssignable(inbox ? data_out.getName() : "`packet_data("+data_out.getName()+")");
- String data_latch_input = inbox ? "`packet_data("+data_in.getName()+")" : data_in.getName();
+ box.addPreCrap("wire [(`DATAWIDTH-1):0] data_latch_output;");
+ box.addPreCrap("assign data_latch_output = " + (inbox ? data_out.getName() : "`packet_data("+data_out.getName()+")")+";");
+
+ Assignable data_latch = new SimpleAssignable(inbox ? data_out.getName() : "`packet_data("+data_out.getName()+")");
+ String data_latch_input = inbox ? "`packet_data("+data_in.getName()+")" : data_in.getName();
box.new Event(
new Object[] { ondeckFull.isFull(),
new ConditionalAction("!`instruction_bit_requeue(ondeck) && `instruction_count(ondeck)!=1", doRepeat.doFill()),
new ConditionalAction("`instruction_count(ondeck)==0", new AssignAction(repcount, "0")),
new ConditionalAction("`instruction_count(ondeck)!=0", new AssignAction(repcount, instruction_count_ondeck+"-1")),
- new ConditionalAction("`instruction_is_literal(ondeck)", new AssignAction(data_latch, "`instruction_literal(ondeck)")),
+ new ConditionalAction("`instruction_is_literal(ondeck)",
+ new AssignAction(data_latch, "`instruction_literal(ondeck,data_latch_output)")),
new ConditionalAction("`instruction_bit_datain(ondeck)", data_in),
new ConditionalAction("`instruction_bit_dataout(ondeck)", data_out),
new ConditionalAction("`instruction_bit_tokenin(ondeck)", token_in),
pw.println("`define instruction_is_normal(i) (i["+(OFFSET_MASK_NORMAL+WIDTH_MASK_NORMAL-1)+":"+OFFSET_MASK_NORMAL+"]=="+MASK_NORMAL+")");
pw.println("`define instruction_bit_requeue(instruction) (instruction["+OFFSET_RQ+"] && !`instruction_is_literal(instruction))");
+ pw.println("`define high_half(w) (w[36:19])"); // FIXME kinda ugly that we mention numbers here
+ pw.println("`define low_half(w) (w[18:0])");
+
pw.println("`define instruction_bit_tokenout(i) (!`instruction_is_literal(i) && i["+OFFSET_TO+"])");
pw.println("`define instruction_bit_tokenoutlast(i) (!`instruction_is_literal(i) && i["+OFFSET_IG+"])");
pw.println("`define instruction_bit_dataout(i) (!`instruction_is_literal(i) && i["+OFFSET_DO+"])");
pw.println("`define instruction_bit_latch(i) (!`instruction_is_literal(i) && i["+OFFSET_DL+"])");
pw.println("`define instruction_bit_datain(i) (!`instruction_is_literal(i) && i["+OFFSET_DI+"])");
pw.println("`define instruction_bit_tokenin(i) (!`instruction_is_literal(i) && i["+OFFSET_TI+"])");
+ pw.println("`define instruction_bit_literal_loadhigh(i) (i["+OFFSET_LITERAL_LOADHIGH+"])");
int signextbits = WIDTH_WORD - WIDTH_LITERAL;
+ /*
pw.println("`define instruction_literal(i) {{ "+signextbits+"{i["+(OFFSET_LITERAL+WIDTH_LITERAL-1)+"]}},"+
" i["+(OFFSET_LITERAL+WIDTH_LITERAL-1)+":"+OFFSET_LITERAL+"]}");
+ */
+
+ pw.println("`define instruction_literal(i,d) "+
+ " (`instruction_bit_literal_loadhigh(i) "+
+ " ? { (i[17:0]), (d[18:0]) } "+
+ " : { (d[36:19]), (i[18:0]) }) ");
+
box.dump(pw);
pw.flush();
return box;
public static final int WIDTH_DEST_ADDR = 11;
public static final int WIDTH_COUNT = 7;
- public static final int OFFSET_MASK_LITERAL = 24;
- public static final int WIDTH_MASK_LITERAL = 2;
- public static final int MASK_LITERAL = 1;
- /*
public static final int OFFSET_MASK_LITERAL = 20;
public static final int WIDTH_MASK_LITERAL = 6;
- public static final int MASK_LITERAL = 13;
- */
+ public static final int MASK_LITERAL = 13; // this is an excessive approximation
+
public static final int OFFSET_MASK_MASSACRE = 14;
public static final int WIDTH_MASK_MASSACRE = 26-14;
public static final int MASK_MASSACRE = 1;
- //public static final int OFFSET_MASK_KILL = 21;
- //public static final int WIDTH_MASK_KILL = 5;
- //public static final int MASK_KILL = 5;
public static final int OFFSET_MASK_KILL = 14;
public static final int WIDTH_MASK_KILL = 26-14;
public static final int MASK_KILL = 0;
- //public static final int OFFSET_MASK_UNCLOG = 21;
- //public static final int WIDTH_MASK_UNCLOG = 5;
- //public static final int MASK_UNCLOG = 2;
public static final int OFFSET_MASK_UNCLOG = 14;
public static final int WIDTH_MASK_UNCLOG = 26-14;
public static final int MASK_UNCLOG = 3;
- //public static final int OFFSET_MASK_CLOG = 21;
- //public static final int WIDTH_MASK_CLOG = 5;
- //public static final int MASK_CLOG = 4;
public static final int OFFSET_MASK_CLOG = 14;
public static final int WIDTH_MASK_CLOG = 26-14;
public static final int MASK_CLOG = 2;
public static final int OFFSET_DL = OFFSET_CONTROL+4;
public static final int OFFSET_DI = OFFSET_CONTROL+5;
public static final int OFFSET_TI = OFFSET_CONTROL+6;
+ public static final int OFFSET_LITERAL_LOADHIGH = 19;
public static final int OFFSET_INSTRUCTIONTYPE = OFFSET_CONTROL+7;
public static final int OFFSET_PUMP_ADDR = OFFSET_INSTRUCTIONTYPE+1;
- public static final int OFFSET_LITERAL = OFFSET_COUNT+WIDTH_COUNT;
- public static final int WIDTH_LITERAL = OFFSET_MASK_LITERAL - OFFSET_LITERAL;
+ public static final int OFFSET_LITERAL = 0;
+ public static final int WIDTH_LITERAL = 19;
+
/** get the bits describing this box's location on the DESTINATION HORN */
protected abstract long getDestAddr(Destination box);
boolean dataOutDest = name.isOutbox() && dataOut && tokenOut;
boolean isLiteral = getIntField(OFFSET_MASK_LITERAL+WIDTH_MASK_LITERAL-1, OFFSET_MASK_LITERAL, inst)==MASK_LITERAL;
if (isLiteral)
- return new Instruction.LocalLiteral(name, getSignedField(OFFSET_LITERAL+WIDTH_LITERAL-1, OFFSET_LITERAL, inst), 0);
+ return new Instruction.LocalLiteral(name, getField(OFFSET_LITERAL+WIDTH_LITERAL-1, OFFSET_LITERAL, inst), 0,
+ getField(OFFSET_LITERAL_LOADHIGH, OFFSET_LITERAL_LOADHIGH, inst)!=0);
if (dataOutDest) tokenOut = false;
return new Instruction.Move(name,
dest,
if (d instanceof Instruction.CodeBagDescriptor) {
Instruction.CodeBagDescriptor lc = (Instruction.CodeBagDescriptor)d;
- d = new Instruction.LocalLiteral(lc.pump, ((lc.offset << WIDTH_CODEBAG_SIZE)) | lc.size, 1);
+ // MAJOR MAJOR FIXME: upper half here...
+ d = new Instruction.LocalLiteral(lc.pump, ((lc.offset << WIDTH_CODEBAG_SIZE)) | lc.size, 1, false);
}
if (d instanceof Instruction.UnClog) {
Instruction.LocalLiteral inst = (Instruction.LocalLiteral)d;
if (inst.pump != null) {
instr |= putField(OFFSET_MASK_LITERAL+WIDTH_MASK_LITERAL-1, OFFSET_MASK_LITERAL, MASK_LITERAL);
- instr |= putSignedField(OFFSET_LITERAL+WIDTH_LITERAL-1, OFFSET_LITERAL, inst.literal);
- // FIXME remove soon
- //instr |= putField(OFFSET_COUNT+WIDTH_COUNT-1, OFFSET_COUNT, inst.count);
+ instr |= putField(OFFSET_LITERAL+WIDTH_LITERAL-1, OFFSET_LITERAL, inst.literal);
+ instr |= putField(OFFSET_LITERAL_LOADHIGH, OFFSET_LITERAL_LOADHIGH, (inst.high?1:0));
} else {
instr = inst.literal;
}
package edu.berkeley.fleet.interpreter;
import edu.berkeley.sbp.util.ANSI;
import edu.berkeley.fleet.api.*;
+import static edu.berkeley.fleet.util.BitManipulations.*;
import java.util.*;
/** this is a generic inbox which stores <32-bit items (tokens or data) */
if (instruction_ instanceof Instruction.Clog) { clogged++; return true; }
if (instruction_ instanceof Instruction.LocalLiteral) {
Instruction.LocalLiteral ll = (Instruction.LocalLiteral)instruction_;
- register = new Packet(getInterpreter(), null, ll.literal, null);
+ long val = (register==null) ? 0 : register.value;
+ val =
+ ll.high
+ ? setField(36, 19, ll.literal, val)
+ : setField(18, 0, ll.literal, val);
+ register = new Packet(getInterpreter(), null, val, null);
return true;
}
Instruction.Move instruction = (Instruction.Move)instruction_;
import edu.berkeley.sbp.util.ANSI;
import edu.berkeley.fleet.api.*;
import edu.berkeley.fleet.ies44.*;
+import edu.berkeley.sbp.util.*;
import edu.berkeley.fleet.util.*;
+import static edu.berkeley.fleet.util.BitManipulations.*;
import edu.berkeley.fleet.api.Instruction;
public class Outbox extends InstructionPump {
if (instruction_ instanceof Instruction.Clog) { clogged++; return true; }
if (instruction_ instanceof Instruction.LocalLiteral) {
Instruction.LocalLiteral ll = (Instruction.LocalLiteral)instruction_;
- register = ll.literal;
+ register =
+ ll.high
+ ? setField(36, 19, ll.literal, register)
+ : setField(18, 0, ll.literal, register);
return true;
}
Instruction.Move instruction = (Instruction.Move)instruction_;
ret = ret >> lowBit;
return ret;
}
-
+ public static long setField(int highBit, int lowBit, long val, long target) {
+ return (target & ~putField(highBit, lowBit, ~(-1L<<(1+highBit-lowBit)))) | putField(highBit, lowBit, val);
+ }
public static long doPutField(int highBit, int lowBit, long val) {
long mask = 0xffffffffffffffffL;
mask = mask << (highBit-lowBit+1);