massive overhaul of fpga code
[fleet.git] / src / edu / berkeley / fleet / fpga / FunnelModule.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
16 public class FunnelModule extends Module {
17
18     private static final int WIDTH = WIDTH_PACKET;
19
20     public FunnelModule() {
21         super("funnel");
22         Module.SinkPort    outp = createOutputPort("out", WIDTH, "");
23         Module.SourcePort  in1p = createInputPort("in1", WIDTH_PACKET);
24         Module.SourcePort  in2p = createInputPort("in2", WIDTH_PACKET);
25
26         // FIXME: biased towards in2p side
27         new Event(new Object[] { in1p, outp, "!"+in2p.getReq() },
28                   new Action[] { in1p, outp,
29                                  new AssignAction(outp, in1p) });
30         new Event(new Object[] { in2p, outp },
31                   new Action[] { in2p, outp,
32                                  new AssignAction(outp, in2p) });
33     }
34
35     public static class FunnelInstance extends Module.InstantiatedModule implements FabricElement {
36         private FabricElement in1 = null;
37         private FabricElement in2 = null;
38         public FabricElement out = null;
39         public Module.SourcePort getOutputPort() { return getOutputPort("out"); }
40         public Module.Port getInputPort()  { throw new RuntimeException("funnel has multiple inputs"); }
41         public FunnelInstance(Module thisModule, Module.SourcePort p1, Module.SourcePort p2) {
42             super(thisModule, new FunnelModule());
43             if (p1 != null) p1.connect(this.getInputPort("in1"));
44             if (p2 != null) p2.connect(this.getInputPort("in2"));
45         }
46         public FunnelInstance(Module thisModule, FabricElement in1, FabricElement in2) {
47             super(thisModule, new FunnelModule());
48             this.in1 = in1;
49             this.in2 = in2;
50             in1.addOutput(this, this.getInputPort("in1"));
51             in2.addOutput(this, this.getInputPort("in2"));
52         }
53         public void addOutput(FabricElement out, Module.Port outPort) {
54             this.out = out;
55             getOutputPort("out").connect((Module.SinkPort)outPort);
56         }
57         public void addInput(FabricElement in, Module.Port source) {
58             throw new RuntimeException("cannot add inputs to a funnel once constructed");
59         }
60         public FpgaPath getPath(FabricElement dest, BitVector signal) {
61             return out.getPath(dest, signal);
62         }
63     }
64
65 }