add new urjtag-based code, fjmem
[fleet.git] / src / edu / berkeley / fleet / fpga / FpgaShip.java
1 package edu.berkeley.fleet.fpga;
2 import edu.berkeley.fleet.api.*;
3 import java.util.*;
4 import java.io.*;
5 import edu.berkeley.fleet.two.*;
6 import static edu.berkeley.fleet.two.FleetTwoFleet.*;
7 import static edu.berkeley.fleet.fpga.verilog.Verilog.*;
8
9 /** a ship, which belongs to a fleet and which may have many ports */
10 public class FpgaShip extends FleetTwoShip {
11         
12     private Module module;
13     private Module.InstantiatedModule instance;
14     private LinkedHashMap<String,FpgaDock> ports = new LinkedHashMap<String,FpgaDock>();
15     LinkedHashMap<String,Module.SourcePort> docklessPorts = new LinkedHashMap<String,Module.SourcePort>();
16
17     /** You should instantiate a bunch of Inboxes and Outboxes in your constructor */
18     public FpgaShip(Fpga fleet, ShipDescription sd) {
19         super(fleet, sd);
20         this.module = new Module(getType().toLowerCase());
21         this.instance = new Module.InstantiatedModule(fleet.getVerilogModule(), module);
22         for(DockDescription sdbb : sd.ports()) {
23             if (sdbb.isDockless()) {
24                 module.createOutputPort(sdbb.getName(), fleet.WIDTH_PACKET);
25                 docklessPorts.put(sdbb.getName(), instance.getOutputPort(sdbb.getName()));
26             } else {
27                 if (sdbb.isInputDock()) module.createInputPort(sdbb.getName(), getFleet().getWordWidth()+1);
28                 else                    module.createOutputPort(sdbb.getName(), getFleet().getWordWidth()+1);
29                 ports.put(sdbb.getName(), new FpgaDock(this, sdbb));
30             }
31         }
32         for(PercolatedPort pp : sd.percolatedPorts)
33             this.module.percolatedPorts.add(pp);
34     }
35
36     public Iterator<Dock> iterator() { return (Iterator<Dock>)(Object)ports.values().iterator(); }
37
38     public Module.InstantiatedModule getVerilogModule() { return instance; }
39 }