/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: Circuit.java
*
* Copyright (c) 2003 Sun Microsystems and Static Free Software
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool.ncc.trees;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import com.sun.electric.tool.ncc.netlist.NetObject;
import com.sun.electric.tool.ncc.netlist.Wire;
import com.sun.electric.tool.ncc.strategy.Strategy;
import com.sun.electric.tool.Job;
/** A Circuit is a collection of NetObjects that belong to the same
* design. For example, a collection of Parts from the schematic.
* <p>
* A Circuit is contained by an Equivalence record.
*/
public class Circuit {
private EquivRecord myParent;
private ArrayList<NetObject> netObjs = new ArrayList<NetObject>();
private Circuit(){}
private static void error(boolean pred, String msg) {
Job.error(pred, msg);
}
// ---------------------- public methods ------------------
public static Circuit please(List<NetObject> netObjs){
Circuit ckt = new Circuit();
for (NetObject n : netObjs) {
ckt.adopt(n);
}
return ckt;
}
/** Remove deleted NetObjects. Minimize storage used. */
public void putInFinalForm() {
Set<NetObject> goodObjs = new HashSet<NetObject>();
for (NetObject n : netObjs) {
if (n.isDeleted()) continue;
error(goodObjs.contains(n), "duplicate NetObj in Circuit!???");
goodObjs.add(n);
if (n instanceof Wire) ((Wire)n).putInFinalForm();
}
netObjs = new ArrayList<NetObject>();
netObjs.addAll(goodObjs);
netObjs.trimToSize();
}
public Iterator<NetObject> getNetObjs() {return netObjs.iterator();}
public int numNetObjs() {return netObjs.size();}
public int numUndeletedNetObjs() {
int count = 0;
for (Iterator<NetObject> it=getNetObjs(); it.hasNext();) {
NetObject n = it.next();
if (!n.isDeleted()) count++;
}
return count;
}
public void adopt(NetObject n) {
netObjs.add(n);
n.setParent(this);
}
//public void remove(NetObject n) {netObjs.remove(n);}
public void checkMe(EquivRecord parent) {
error(getParent()!=parent, "wrong parent");
}
public String nameString(){
return "Circuit code=" + getCode() +
" size=" + numNetObjs();
}
public int getCode(){
return myParent!=null ? myParent.getCode() : 0;
}
public EquivRecord getParent(){return myParent;}
public void setParent(EquivRecord p){
myParent= (EquivRecord)p;
}
public HashMap<Integer,List<NetObject>> apply(Strategy js){
HashMap<Integer,List<NetObject>> codeToNetObjs = new HashMap<Integer,List<NetObject>>();
for (Iterator<NetObject> it=getNetObjs(); it.hasNext();) {
NetObject no= it.next();
Integer code = js.doFor(no);
error(code==null, "null is no longer a legal code");
ArrayList<NetObject> ns = (ArrayList<NetObject>) codeToNetObjs.get(code);
if(ns==null) {
ns = new ArrayList<NetObject>();
codeToNetObjs.put(code, ns);
}
ns.add(no);
}
return codeToNetObjs;
}
}