/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: BookshelfNodes.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.io.input.bookshelf;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.topology.NodeInst;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.io.input.bookshelf.BookshelfNets.BookshelfNet;
import com.sun.electric.util.CollectionFactory;
import com.sun.electric.util.TextUtils;
import java.awt.geom.Point2D;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
/**
* @author Felix Schmidt
*
*/
public class BookshelfNodes implements BookshelfInputParser<Void> {
private String nodesFile;
public BookshelfNodes(String nodesFile) {
this.nodesFile = nodesFile;
}
public Void parse() throws IOException {
Job.getUserInterface().setProgressNote("Parse Nodes File");
BufferedReader rin;
try
{
File file = new File(nodesFile);
FileReader freader = new FileReader(file);
rin = new BufferedReader(freader);
} catch (FileNotFoundException e) {
System.out.println("ERROR: Cannot find Bookshelf Nodes file: " + nodesFile);
return null;
}
String line;
while ((line = rin.readLine()) != null) {
if (line.startsWith(" ")) {
StringTokenizer tokenizer = new StringTokenizer(line, " ");
int i = 0;
String name = "";
double height = 0;
double width = 0;
boolean isTerminal = false;
while (tokenizer.hasMoreTokens()) {
if (i == 0) {
name = tokenizer.nextToken();
} else if (i == 1) {
width = TextUtils.atof(tokenizer.nextToken());
} else if (i == 2) {
height = TextUtils.atof(tokenizer.nextToken());
} else if (i == 3) {
if (tokenizer.nextToken().toLowerCase().equals("terminal")) {
isTerminal = true;
}
} else {
tokenizer.nextToken();
}
i++;
}
new BookshelfNode(name, width, height, isTerminal);
}
}
return null;
}
public static class BookshelfNode {
private String name;
private double width;
private double height;
private double x, y;
private boolean terminal;
private List<BookshelfPin> pins;
private Cell prototype;
private NodeInst instance;
private static Map<String, BookshelfNode> nodeMap = new HashMap<String, BookshelfNode>();
private int weight;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the width
*/
public double getWidth() {
return width;
}
/**
* @param width
* the width to set
*/
public void setWidth(double width) {
this.width = width;
}
/**
* @return the height
*/
public double getHeight() {
return height;
}
/**
* @param height
* the height to set
*/
public void setHeight(double height) {
this.height = height;
}
/**
* @return the X coordinate
*/
public double getX() {
return x;
}
/**
* @return the Y coordinate
*/
public double getY() {
return y;
}
/**
* @param x
* the X coordinate to set
* @param y
* the Y coordinate to set
*/
public void setLocation(double x, double y) {
this.x = x;
this.y = y;
}
/**
* @return the Cell prototype
*/
public Cell getPrototype() {
return prototype;
}
/**
* @param cell
* the Cell prototype
*/
public void setInstance(NodeInst instance) {
this.instance = instance;
}
/**
* @return the Cell prototype
*/
public NodeInst getInstance() {
return instance;
}
/**
* @param cell
* the Cell prototype
*/
public void setPrototype(Cell prototype) {
this.prototype = prototype;
}
/**
* @param name
* @param width
* @param height
*/
public BookshelfNode(String name, double width, double height, boolean terminal) {
this.name = name;
this.width = width;
this.height = height;
this.x = this.y = 0;
this.setTerminal(terminal);
this.pins = CollectionFactory.createArrayList();
nodeMap.put(name, this);
}
/**
* Find a BookshelfNode from its name.
*
* @param name
* the name of the BookshelfNode.
* @return the BookshelfNode with that name (null if not found).
*/
public static BookshelfNode findNode(String name) {
return nodeMap.get(name);
}
/**
* Return a list of all BookshelfNodes.
*
* @return a list of all BookshelfNodes.
*/
public static Collection<BookshelfNode> getAllNodes() {
return nodeMap.values();
}
/**
* @param pins
* the pins to set
*/
public void setPins(List<BookshelfPin> pins) {
this.pins = pins;
}
/**
* @return the pins
*/
public List<BookshelfPin> getPins() {
return pins;
}
/**
* @param terminal
* the terminal to set
*/
public void setTerminal(boolean terminal) {
this.terminal = terminal;
}
/**
* @return the terminal
*/
public boolean isTerminal() {
return terminal;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
//object_name width height terminal
builder.append(this.name + " ");
builder.append(String.valueOf(this.width) + " ");
builder.append(String.valueOf(this.height));
if(this.terminal) {
builder.append(" terminal");
}
return builder.toString();
}
/**
* @param weight the weight to set
*/
public void setWeight(int weight) {
this.weight = weight;
}
/**
* @return the weight
*/
public int getWeight() {
return weight;
}
}
public static class BookshelfPin {
private Point2D location;
private BookshelfNet net;
private String nodeName;
/**
* @param location
*/
public BookshelfPin(Point2D location, BookshelfNet net, String nodeName) {
super();
this.location = location;
this.setNet(net);
this.nodeName = nodeName;
}
/**
* @param location
* the location to set
*/
public void setLocation(Point2D location) {
this.location = location;
}
/**
* @return the location
*/
public Point2D getLocation() {
return location;
}
/**
* @param net
* the net to set
*/
public void setNet(BookshelfNet net) {
this.net = net;
}
/**
* @return the net
*/
public BookshelfNet getNet() {
return net;
}
/**
* @param nodeName
* the nodeName to set
*/
public void setNodeName(String nodeName) {
this.nodeName = nodeName;
}
/**
* @return the nodeName
*/
public String getNodeName() {
return nodeName;
}
}
}