add new urjtag-based code, fjmem
[fleet.git] / src / edu / berkeley / fleet / fpga / FifoModule.java
1 package edu.berkeley.fleet.fpga;
2 import edu.berkeley.fleet.api.*;
3 import edu.berkeley.fleet.two.*;
4 import edu.berkeley.fleet.*;
5 import java.lang.reflect.*;
6 import edu.berkeley.sbp.chr.*;
7 import edu.berkeley.sbp.misc.*;
8 import edu.berkeley.sbp.meta.*;
9 import edu.berkeley.sbp.util.*;
10 import java.util.*;
11 import java.io.*;
12 import static edu.berkeley.fleet.two.FleetTwoFleet.*;
13 import static edu.berkeley.fleet.fpga.verilog.Verilog.*;
14
15 public class FifoModule extends Module {
16     private int len;
17     private int width;
18     private boolean doubleSpeed;
19     public FifoModule(int len, int width) { this(len, width, false); }
20     public FifoModule(int len, int width, boolean doubleSpeed) {
21         super("fifo"+len+"x"+width+(doubleSpeed?"_2x":""));
22         this.len = len;
23         this.width = width;
24         this.doubleSpeed = doubleSpeed;
25         Module.SourcePort  in  = createInputPort("in", width);
26         Module.SinkPort    out = createOutputPort("out", width);
27         Module.InstantiatedModule[] stages = new Module.InstantiatedModule[len];
28         if (len==0) {
29             in.connect(out);
30         } else if (len==1) {
31             if (doubleSpeed) throw new RuntimeException();
32             new Event(new Object[] { in, out },
33                       new Action[] { in, out, new AssignAction(out, in) });
34         } else {
35             Module fifo1 = new FifoModule(1,width);
36             for(int i=0; i<=len; i++) {
37                 if (i<len) stages[i] = new Module.InstantiatedModule(this, fifo1);
38                 Module.SourcePort driver = i==0 ? in : stages[i-1].getOutputPort("out");
39                 Module.SinkPort   driven = i==len ? out : stages[i].getInputPort("in");
40                 driver.connect(driven);
41             }
42         }
43     }
44
45     int dislog(int num) {
46         for(int i=0; i<32; i++)
47             if ((1<<i) >= num)
48                 return i;
49         throw new RuntimeException();
50     }
51
52     public void dump(String prefix) throws IOException {
53         if (len>16) throw new RuntimeException("FifoModule(i>16) not supported due to SRL16 limitation");
54
55         if (len>=2) {
56             PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(prefix+"/"+name+".v")));
57             pw.println("`define ADDR_BITS "+dislog(len));
58             pw.println("`define WIDTH " + width);
59             pw.println("`define MODULE_NAME "+name);
60             if (doubleSpeed) {
61                 pw.println("`define DELAY 2");
62             } else {
63                 pw.println("`define DELAY 5");
64             }
65             pw.println("`include \"ramfifo.inc\"");
66             pw.flush();
67             return;
68         }
69         if (doubleSpeed) throw new RuntimeException();
70
71         super.dump(prefix);
72         return;
73     }
74 }