package com.sun.electric.tool.generator.flag.router;
import java.util.ArrayList;
import java.util.List;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.network.Netlist;
import com.sun.electric.database.network.Network;
import com.sun.electric.database.topology.ArcInst;
import com.sun.electric.database.topology.PortInst;
import com.sun.electric.technology.ArcProto;
import com.sun.electric.technology.Technology;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.routing.SeaOfGates;
import com.sun.electric.tool.routing.SeaOfGatesEngine;
/** The SogRouter is an adapter between FLAG and Electric's built in
* Sea of Gates router. */
public class SogRouterAdapter {
private static final boolean SORT_UNROUTED_ARCS = true;
private static final boolean DUMP_UNROUTED_ARCS = false;
private final Job job;
private final SeaOfGatesEngine seaOfGates = SORT_UNROUTED_ARCS ? null : new SeaOfGatesEngine();
private final Technology generic = Technology.findTechnology("Generic");
private final ArcProto unroutedArc = generic.findArcProto("Unrouted");
private Cell findParent(List<ToConnect> toConns) {
for (ToConnect tc : toConns) {
for (PortInst pi : tc.getPortInsts()) {
return pi.getNodeInst().getParent();
}
}
return null;
}
private List<ArcInst> addUnroutedArcs(Cell cell, List<ToConnect> toConns) {
Netlist nl = cell.getNetlist();
List<ArcInst> unroutedArcs = new ArrayList<ArcInst>();
for (ToConnect tc : toConns) {
PortInst firstPi = null;
Network firstNet = null;
for (PortInst pi : tc.getPortInsts()) {
if (firstPi==null) {
firstPi = pi;
firstNet = nl.getNetwork(firstPi);
continue;
}
Network net = nl.getNetwork(pi);
if (firstNet==net) continue;
ArcInst ai = ArcInst.newInstanceBase(unroutedArc, 1, firstPi, pi);
unroutedArcs.add(ai);
}
}
return unroutedArcs;
}
// ----------------------------- public methods ---------------------------
public SogRouterAdapter(Job job) {this.job = job;}
public void route(List<ToConnect> toConns, SeaOfGates.SeaOfGatesOptions prefs) {
Cell cell = findParent(toConns);
if (cell==null) return; // no work to do
List<ArcInst> arcsToRoute = addUnroutedArcs(cell, toConns);
if (DUMP_UNROUTED_ARCS) {
String newName = cell.getName() + "_unrouted{lay}";
Cell.copyNodeProto(cell, cell.getLibrary(), newName, true);
}
if (SORT_UNROUTED_ARCS)
SeaOfGates.seaOfGatesRoute(cell, prefs);
else
seaOfGates.routeIt(job, cell, arcsToRoute, prefs);
}
}