updates that were lying around but never got checked in; includes reorg of gui
[slipway.git] / src / edu / berkeley / slipway / mpar / PhysicalDevice.java
1 package edu.berkeley.slipway.mpar;
2 import byucc.edif.tools.merge.*;
3 import byucc.edif.*;
4 import java.io.*;
5 import java.util.*;
6 import edu.berkeley.slipway.*;
7 import static edu.berkeley.slipway.mpar.MPARDemo.*;
8
9 public abstract class PhysicalDevice implements Iterable<PhysicalDevice.PhysicalNet> {
10
11     public abstract PhysicalCell getCell(int col, int row);
12     public abstract PhysicalCell randomCell(Random rand);
13
14     private HashSet<PhysicalNet> allPhysicalNets = new HashSet<PhysicalNet>();
15     public Iterator<PhysicalNet> iterator() { return allPhysicalNets.iterator(); }
16
17     public abstract class PhysicalCell {
18         public abstract PhysicalNet getNet(String name);
19         public abstract void setFunction(String type);
20         public abstract void place(NetList.Node n);
21         public abstract PhysicalCell randomCellWithin(Random rand, double percentOfDevice);
22     }
23
24     private int master_idx = 0;
25
26     public int getNumPhysicalNets() { return master_idx; }
27     public class PhysicalNet implements Iterable<PhysicalPip>, Comparable<PhysicalNet> {
28
29         public final int idx = master_idx++;
30
31         // temporary variables used during route searches
32         double      distance = Double.MAX_VALUE;
33         double      delay = Double.MAX_VALUE;
34         PhysicalNet backpointer = null;
35         int iteration = 0;
36         int depth = 0;
37         boolean remaining = false;
38
39         // adjacent pips
40         public final HashSet<PhysicalPip> pips = new HashSet<PhysicalPip>();
41
42         private String name;
43
44         /** ordering is based on distance so we can use the Java PriorityQueue class */
45         public int compareTo(PhysicalNet pn) {
46             double x = distance - pn.distance;
47             return x>0
48                 ? 1
49                 : x<0
50                 ? -1
51                 : 0;
52         }
53
54         public Iterator<PhysicalPip> iterator() { return pips.iterator(); }
55         public PhysicalNet(String name) {
56             this.name = name;
57             allPhysicalNets.add(this);
58         }
59         public String toString() { return name; }
60         private void addPip(PhysicalPip pip) { pips.add(pip); }
61         public PhysicalPip getPipFrom(PhysicalNet pn) {
62             for(PhysicalPip pip : pn)
63                 for(PhysicalNet pn2 : pip.getDrivenNets())
64                     if (pn2==this)
65                         return pip;
66             return null;
67         }
68     }
69         
70     public abstract class PhysicalPip {
71         public PhysicalNet   driver;
72         public PhysicalNet[] driven;
73         private String name;
74         double defaultCost;
75         double defaultDelay = 1;
76         public abstract boolean prohibited();
77         public String toString() { return name; }
78         public PhysicalNet   getDriverNet()  { return driver; }
79         public PhysicalNet[] getDrivenNets() { return driven; }
80         public double        getDelay(PhysicalNet in, PhysicalNet out) { return defaultDelay; }
81         public double        getCost(PhysicalNet in, PhysicalNet out) { return defaultCost; }
82         public abstract int getX();
83         public abstract int getY();
84         public PhysicalPip(String name, PhysicalNet driver, PhysicalNet[] driven) { this(name, driver, driven, wireCost); }
85         public PhysicalPip(String name, PhysicalNet driver, PhysicalNet[] driven, double defaultCost) {
86             this.name = name;
87             this.driver = driver;
88             this.driven = driven;
89             this.defaultCost = 1;
90             if (driver != null) driver.addPip(this);
91             for(PhysicalNet pn : driven) pn.addPip(this);
92         }
93         public abstract void set(boolean connected);
94     }
95         
96 }