massive overhaul of fpga code
[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     public FifoModule(int len, int width) {
19         super("fifo"+len+"x"+width);
20         this.len = len;
21         this.width = width;
22         Module.SourcePort  in  = createInputPort("in", width);
23         Module.SinkPort    out = createOutputPort("out", width, "");
24         Module.InstantiatedModule[] stages = new Module.InstantiatedModule[len];
25         if (len==0) {
26             in.hasLatch = false;
27             out.hasLatch = false;
28             addPreCrap("assign out    = in;");
29             addPreCrap("assign out_r  = in_r;");
30             addPreCrap("assign in_a   = out_a;");
31         } else if (len==1) {
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         if (len<2) {
55             super.dump(prefix);
56             return;
57         }
58         PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(prefix+"/"+name+".v")));
59         pw.println("`define ADDR_BITS "+dislog(len));
60         pw.println("`define WIDTH " + width);
61         pw.println("`define MODULE_NAME "+name);
62         pw.println("`include \"ramfifo.inc\"");
63         pw.flush();
64     }
65 }