package edu.berkeley.fleet.ir;
+import edu.berkeley.fleet.loops.*;
import java.util.*;
import java.net.*;
import edu.berkeley.fleet.two.*;
package edu.berkeley.fleet.ir;
+import edu.berkeley.fleet.loops.*;
import java.util.concurrent.Semaphore;
import java.util.*;
import java.net.*;
import edu.berkeley.fleet.api.Instruction.*;
import edu.berkeley.fleet.api.Instruction.Set;
import edu.berkeley.fleet.api.Instruction.Set.*;
-import edu.berkeley.fleet.ir.Context.LoopFactory;
+import edu.berkeley.fleet.loops.Context.LoopFactory;
import static edu.berkeley.fleet.util.BitManipulations.*;
import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
import edu.berkeley.fleet.api.Instruction.Set;
import edu.berkeley.fleet.api.Instruction.Set.SetDest;
import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
import static edu.berkeley.fleet.api.Predicate.*;
-import edu.berkeley.fleet.ir.Context.LoopFactory;
public class Counter {
package edu.berkeley.fleet.ir;
+import edu.berkeley.fleet.loops.*;
import java.util.concurrent.Semaphore;
import java.util.*;
import java.net.*;
import edu.berkeley.fleet.api.Instruction.*;
import edu.berkeley.fleet.api.Instruction.Set;
import edu.berkeley.fleet.api.Instruction.Set.*;
-import edu.berkeley.fleet.ir.Context.LoopFactory;
+import edu.berkeley.fleet.loops.Context.LoopFactory;
import static edu.berkeley.fleet.util.BitManipulations.*;
import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
import edu.berkeley.fleet.api.Instruction.Set;
import edu.berkeley.fleet.api.Instruction.Set.SetDest;
import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
import static edu.berkeley.fleet.api.Predicate.*;
-import edu.berkeley.fleet.ir.Context.LoopFactory;
/*
- Change Alu behavior to "drain one"
package edu.berkeley.fleet;
+import edu.berkeley.fleet.loops.*;
// EXPERIMENTAL. Do not use.
package edu.berkeley.fleet.ir;
+import edu.berkeley.fleet.loops.*;
import java.util.*;
import java.net.*;
import edu.berkeley.fleet.two.*;
package edu.berkeley.fleet.ir;
+import edu.berkeley.fleet.loops.*;
import edu.berkeley.fleet.api.*;
import edu.berkeley.fleet.api.Instruction.*;
import edu.berkeley.fleet.fpga.*;
import edu.berkeley.fleet.api.Instruction.Set.SetDest;
import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
import static edu.berkeley.fleet.api.Predicate.*;
-import edu.berkeley.fleet.ir.Context.LoopFactory;
+import edu.berkeley.fleet.loops.Context.LoopFactory;
import java.io.*;
import java.util.*;
import java.net.*;
package edu.berkeley.fleet.ir;
+import edu.berkeley.fleet.loops.*;
import java.util.concurrent.Semaphore;
import java.util.*;
import java.net.*;
package edu.berkeley.fleet.ir;
+import edu.berkeley.fleet.loops.*;
// ScanRows+Fix: HARD!
/**
+++ /dev/null
-package edu.berkeley.fleet.ir;
-import java.util.*;
-import java.net.*;
-import edu.berkeley.fleet.two.*;
-import edu.berkeley.fleet.api.*;
-import edu.berkeley.fleet.api.Instruction.*;
-import edu.berkeley.fleet.api.Instruction.Set;
-import edu.berkeley.fleet.api.Instruction.Set.*;
-import static edu.berkeley.fleet.util.BitManipulations.*;
-
-// FEATURE: hierarchical ShipPools, wherein a ship may never be
-// allocated in two pools where one is an ancestor of the other
-public class ShipPool implements Iterable<Ship> {
-
- public final Fleet fleet;
-
- public ShipPool(Fleet fleet) { this.fleet = fleet; }
-
- private HashSet<Ship> allocatedShips = new HashSet<Ship>();
-
- public Iterator<Ship> iterator() { return allocatedShips.iterator(); }
-
- public Ship allocateShip(String name) {
- for(int i=0; ; i++) {
- Ship ship = fleet.getShip(name, i);
- if (ship==null)
- throw new RuntimeException("no more ships of type " + name);
- if (allocatedShips.contains(ship)) continue;
- allocatedShips.add(ship);
- return ship;
- }
- }
-}
-package edu.berkeley.fleet.ir;
+package edu.berkeley.fleet.loops;
import java.util.*;
import java.net.*;
import edu.berkeley.fleet.two.*;
--- /dev/null
+package edu.berkeley.fleet.loops;
+import java.util.*;
+import edu.berkeley.fleet.api.*;
+import static edu.berkeley.fleet.util.BitManipulations.*;
+
+/**
+ * A ShipPool keeps track of ships which have been "allocated" and
+ * are in use. ShipPools may be arranged in a hierarchy; allocating
+ * a ship in one pool will allocate it in all ancestors.
+ */
+public class ShipPool implements Iterable<Ship> {
+
+ public final Fleet fleet;
+ public final ShipPool ancestor;
+
+ private HashSet<Ship> allocatedShips = new HashSet<Ship>();
+
+ public ShipPool(Fleet fleet) { this(fleet, null); }
+ public ShipPool(Fleet fleet, ShipPool ancestor) {
+ this.fleet = fleet;
+ this.ancestor = ancestor;
+ }
+
+ public Iterator<Ship> iterator() { return allocatedShips.iterator(); }
+
+ /** allocate a ship */
+ public Ship allocateShip(String type) {
+ Ship ship = null;
+ if (ancestor != null) {
+ ship = ancestor.allocateShip(type);
+ } else {
+ for(int i=0; ; i++) {
+ ship = fleet.getShip(type, i);
+ if (ship==null)
+ throw new RuntimeException("no more ships of type " + type);
+ if (!allocatedShips.contains(ship)) break;
+ }
+ }
+ allocatedShips.add(ship);
+ return ship;
+ }
+
+ /** release an allocated ship */
+ public void releaseShip(Ship ship) {
+ if (!allocatedShips.contains(ship))
+ throw new RuntimeException("ship " + ship + " released but was not allocated");
+ allocatedShips.remove(ship);
+ if (ancestor != null) ancestor.releaseShip(ship);
+ }
+
+}