Merge branch 'master' of git://git.hcoop.net/git/crawshaw/fleet
[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.connect(out);
27         } else if (len==1) {
28             new Event(new Object[] { in, out },
29                       new Action[] { in, out, new AssignAction(out, in) });
30         } else {
31             Module fifo1 = new FifoModule(1,width);
32             for(int i=0; i<=len; i++) {
33                 if (i<len) stages[i] = new Module.InstantiatedModule(this, fifo1);
34                 Module.SourcePort driver = i==0 ? in : stages[i-1].getOutputPort("out");
35                 Module.SinkPort   driven = i==len ? out : stages[i].getInputPort("in");
36                 driver.connect(driven);
37             }
38         }
39     }
40
41     int dislog(int num) {
42         for(int i=0; i<32; i++)
43             if ((1<<i) >= num)
44                 return i;
45         throw new RuntimeException();
46     }
47
48     public void dump(String prefix) throws IOException {
49         if (len>16) throw new RuntimeException("FifoModule(i>16) not supported due to SRL16 limitation");
50
51         if (len>=2) {
52             PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(prefix+"/"+name+".v")));
53             pw.println("`define ADDR_BITS "+dislog(len));
54             pw.println("`define WIDTH " + width);
55             pw.println("`define MODULE_NAME "+name);
56             pw.println("`include \"ramfifo.inc\"");
57             pw.flush();
58             return;
59         }
60
61         super.dump(prefix);
62         return;
63     }
64 }