/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: RoutingFrameSample.java
*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*
* 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.routing.experimentalSample;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.tool.routing.RoutingFrame;
import java.awt.geom.Point2D;
import java.util.List;
/**
* Sample Routing algorithm to illustrate the routing framework.
*/
public class RoutingFrameSample extends RoutingFrame
{
// examples of parameters (integer, string, double, and boolean)
public RoutingParameter maxThreadsParam = new RoutingParameter("threads", "Number of Threads to use:", 5);
public RoutingParameter happinessParam = new RoutingParameter("happiness", "Happiness level:", "happy");
public RoutingParameter numericParam = new RoutingParameter("double", "Floating-point value:", 7.2);
public RoutingParameter booleanParam = new RoutingParameter("toggle", "Run quickly:", true);
/**
* Method to return the name of this routing algorithm.
* @return the name of this routing algorithm.
*/
public String getAlgorithmName() { return "Simple"; }
/**
* Method to do Simple routing.
*/
protected void runRouting(Cell cell, List<RoutingSegment> segmentsToRoute, List<RoutingLayer> allLayers,
List<RoutingContact> allContacts, List<RoutingGeometry> otherBlockages)
{
// look at every segment that needs to be routed
for(RoutingSegment rs : segmentsToRoute)
{
// get the layers that can connect to the two ends of the segment
List<RoutingLayer> startLayers = rs.getStartLayers();
List<RoutingLayer> finishLayers = rs.getFinishLayers();
// see if there is a common layer so that a single wire can be run
RoutingLayer commonLayer = null;
for(RoutingLayer rl1 : startLayers)
{
for(RoutingLayer rl2 : finishLayers)
{
if (rl1 == rl2) { commonLayer = rl1; break; }
}
if (commonLayer != null) break;
}
if (commonLayer != null)
{
// one layer: make a direct connection (at any angle)
RoutePoint p1 = new RoutePoint(RoutingContact.STARTPOINT, rs.getStartEnd().getLocation(), 0);
rs.addWireEnd(p1);
RoutePoint p2 = new RoutePoint(RoutingContact.FINISHPOINT, rs.getFinishEnd().getLocation(), 0);
rs.addWireEnd(p2);
RouteWire rw = new RouteWire(commonLayer, p1, p2, commonLayer.getMinWidth());
rs.addWire(rw);
} else
{
// different layer: find a contact that connects them
for(RoutingContact rc : allContacts)
{
RoutingLayer startLayer = null, finishLayer = null;
for(RoutingLayer rl : startLayers)
if (rl == rc.getFirstLayer() || rl == rc.getSecondLayer()) { startLayer = rl; break; }
for(RoutingLayer rl : finishLayers)
if (rl == rc.getFirstLayer() || rl == rc.getSecondLayer()) { finishLayer = rl; break; }
// if this contact makes the connection, place it
if (startLayer != null && finishLayer != null)
{
RoutePoint p1 = new RoutePoint(RoutingContact.STARTPOINT, rs.getStartEnd().getLocation(), 0);
rs.addWireEnd(p1);
RoutePoint p2 = new RoutePoint(RoutingContact.FINISHPOINT, rs.getFinishEnd().getLocation(), 0);
rs.addWireEnd(p2);
// place the bend at an arbitrary corner of the route
Point2D contLoc = new Point2D.Double(rs.getStartEnd().getLocation().getX(), rs.getFinishEnd().getLocation().getY());
RoutePoint pCon = new RoutePoint(rc, contLoc, 0);
rs.addWireEnd(pCon);
// now define wires to the bend point
RouteWire rw1 = new RouteWire(startLayer, p1, pCon, startLayer.getMinWidth());
rs.addWire(rw1);
RouteWire rw2 = new RouteWire(finishLayer, pCon, p2, finishLayer.getMinWidth());
rs.addWire(rw2);
break;
}
}
}
}
}
}