From 9a6b5e8ffae60c66f34ae3868517af7f4c9bf061 Mon Sep 17 00:00:00 2001 From: megacz Date: Fri, 13 Mar 2009 08:50:10 -0700 Subject: [PATCH] move Context and ShipPool into loops, add releaseShip() and hierarchical pools --- src/edu/berkeley/fleet/ir/CodeBag.java | 1 + src/edu/berkeley/fleet/ir/Counter.java | 4 +- src/edu/berkeley/fleet/ir/Gadgets.java | 4 +- src/edu/berkeley/fleet/ir/IR.java | 1 + src/edu/berkeley/fleet/ir/Junk.java | 1 + src/edu/berkeley/fleet/ir/New.java | 3 +- src/edu/berkeley/fleet/ir/Process.java | 1 + src/edu/berkeley/fleet/ir/Sheets.java | 1 + src/edu/berkeley/fleet/ir/ShipPool.java | 33 ------------- src/edu/berkeley/fleet/{ir => loops}/Context.java | 2 +- src/edu/berkeley/fleet/loops/ShipPool.java | 51 +++++++++++++++++++++ 11 files changed, 63 insertions(+), 39 deletions(-) delete mode 100644 src/edu/berkeley/fleet/ir/ShipPool.java rename src/edu/berkeley/fleet/{ir => loops}/Context.java (99%) create mode 100644 src/edu/berkeley/fleet/loops/ShipPool.java diff --git a/src/edu/berkeley/fleet/ir/CodeBag.java b/src/edu/berkeley/fleet/ir/CodeBag.java index 1b4d06f..f420d03 100644 --- a/src/edu/berkeley/fleet/ir/CodeBag.java +++ b/src/edu/berkeley/fleet/ir/CodeBag.java @@ -1,4 +1,5 @@ package edu.berkeley.fleet.ir; +import edu.berkeley.fleet.loops.*; import java.util.*; import java.net.*; import edu.berkeley.fleet.two.*; diff --git a/src/edu/berkeley/fleet/ir/Counter.java b/src/edu/berkeley/fleet/ir/Counter.java index e6ea2ab..1bd1920 100644 --- a/src/edu/berkeley/fleet/ir/Counter.java +++ b/src/edu/berkeley/fleet/ir/Counter.java @@ -1,4 +1,5 @@ package edu.berkeley.fleet.ir; +import edu.berkeley.fleet.loops.*; import java.util.concurrent.Semaphore; import java.util.*; import java.net.*; @@ -8,14 +9,13 @@ 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 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 { diff --git a/src/edu/berkeley/fleet/ir/Gadgets.java b/src/edu/berkeley/fleet/ir/Gadgets.java index 06246cd..efd6df7 100644 --- a/src/edu/berkeley/fleet/ir/Gadgets.java +++ b/src/edu/berkeley/fleet/ir/Gadgets.java @@ -1,4 +1,5 @@ package edu.berkeley.fleet.ir; +import edu.berkeley.fleet.loops.*; import java.util.concurrent.Semaphore; import java.util.*; import java.net.*; @@ -8,14 +9,13 @@ 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 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" diff --git a/src/edu/berkeley/fleet/ir/IR.java b/src/edu/berkeley/fleet/ir/IR.java index 855dea5..40fe629 100644 --- a/src/edu/berkeley/fleet/ir/IR.java +++ b/src/edu/berkeley/fleet/ir/IR.java @@ -1,4 +1,5 @@ package edu.berkeley.fleet; +import edu.berkeley.fleet.loops.*; // EXPERIMENTAL. Do not use. diff --git a/src/edu/berkeley/fleet/ir/Junk.java b/src/edu/berkeley/fleet/ir/Junk.java index 9fc1ce2..2df0776 100644 --- a/src/edu/berkeley/fleet/ir/Junk.java +++ b/src/edu/berkeley/fleet/ir/Junk.java @@ -1,4 +1,5 @@ package edu.berkeley.fleet.ir; +import edu.berkeley.fleet.loops.*; import java.util.*; import java.net.*; import edu.berkeley.fleet.two.*; diff --git a/src/edu/berkeley/fleet/ir/New.java b/src/edu/berkeley/fleet/ir/New.java index 54a5977..f1553a0 100644 --- a/src/edu/berkeley/fleet/ir/New.java +++ b/src/edu/berkeley/fleet/ir/New.java @@ -1,4 +1,5 @@ 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.*; @@ -8,7 +9,7 @@ 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; +import edu.berkeley.fleet.loops.Context.LoopFactory; import java.io.*; import java.util.*; import java.net.*; diff --git a/src/edu/berkeley/fleet/ir/Process.java b/src/edu/berkeley/fleet/ir/Process.java index 9decf30..ce82b5a 100644 --- a/src/edu/berkeley/fleet/ir/Process.java +++ b/src/edu/berkeley/fleet/ir/Process.java @@ -1,4 +1,5 @@ package edu.berkeley.fleet.ir; +import edu.berkeley.fleet.loops.*; import java.util.concurrent.Semaphore; import java.util.*; import java.net.*; diff --git a/src/edu/berkeley/fleet/ir/Sheets.java b/src/edu/berkeley/fleet/ir/Sheets.java index bb32360..a9bff6d 100644 --- a/src/edu/berkeley/fleet/ir/Sheets.java +++ b/src/edu/berkeley/fleet/ir/Sheets.java @@ -1,4 +1,5 @@ package edu.berkeley.fleet.ir; +import edu.berkeley.fleet.loops.*; // ScanRows+Fix: HARD! /** diff --git a/src/edu/berkeley/fleet/ir/ShipPool.java b/src/edu/berkeley/fleet/ir/ShipPool.java deleted file mode 100644 index a3fee4f..0000000 --- a/src/edu/berkeley/fleet/ir/ShipPool.java +++ /dev/null @@ -1,33 +0,0 @@ -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 { - - public final Fleet fleet; - - public ShipPool(Fleet fleet) { this.fleet = fleet; } - - private HashSet allocatedShips = new HashSet(); - - public Iterator 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; - } - } -} diff --git a/src/edu/berkeley/fleet/ir/Context.java b/src/edu/berkeley/fleet/loops/Context.java similarity index 99% rename from src/edu/berkeley/fleet/ir/Context.java rename to src/edu/berkeley/fleet/loops/Context.java index 229ce1b..3ec2ca1 100644 --- a/src/edu/berkeley/fleet/ir/Context.java +++ b/src/edu/berkeley/fleet/loops/Context.java @@ -1,4 +1,4 @@ -package edu.berkeley.fleet.ir; +package edu.berkeley.fleet.loops; import java.util.*; import java.net.*; import edu.berkeley.fleet.two.*; diff --git a/src/edu/berkeley/fleet/loops/ShipPool.java b/src/edu/berkeley/fleet/loops/ShipPool.java new file mode 100644 index 0000000..673872a --- /dev/null +++ b/src/edu/berkeley/fleet/loops/ShipPool.java @@ -0,0 +1,51 @@ +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 { + + public final Fleet fleet; + public final ShipPool ancestor; + + private HashSet allocatedShips = new HashSet(); + + public ShipPool(Fleet fleet) { this(fleet, null); } + public ShipPool(Fleet fleet, ShipPool ancestor) { + this.fleet = fleet; + this.ancestor = ancestor; + } + + public Iterator 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); + } + +} -- 1.7.10.4