/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: Node.java * * Copyright (c) 2003, 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.generator.flag.hornFunnel2; import java.util.List; public class Node { private static int nodeCounter = 1; private final int id; private final int height; // Height in the tree. // height of leaf Node is 1 private final Node leftChild, rightChild, parent; private int slot; public Node(Node parent, int height, int slot, List<Node> slots) { this.id = nodeCounter++; this.parent = parent; this.height = height; this.slot = slot; slots.set(slot, this); if (height==1) { leftChild = rightChild = null; } else { int childHeight = height-1; int childNbSlots = (int) (Math.pow(2, childHeight)-1); int halfChildSlots = (childNbSlots+1) /2; leftChild = new Node(this, childHeight, slot-halfChildSlots, slots); rightChild = new Node(this, childHeight, slot+halfChildSlots, slots); } } public Node getLeftChild() {return leftChild;} public Node getRightChild() {return rightChild;} public Node getParent() {return parent;} public int getSlot(){return slot;} public void setSlot(int s) {slot=s;} public int getHeight() {return height;} public boolean isLeaf() {return leftChild==null;} public boolean isRoot() {return parent==null;} public int getMinChildWireSlot() { int s = getSlot(); if (isLeaf()) return s; s = Math.min(s, getLeftChild().getSlot()); s = Math.min(s, getRightChild().getSlot()); return s; } public int getMaxChildWireSlot() { int s = getSlot(); if (isLeaf()) return s; s = Math.max(s, getLeftChild().getSlot()); s = Math.max(s, getRightChild().getSlot()); return s; } public int getChildWireLength() { return getMaxChildWireSlot() - getMinChildWireSlot(); } public int getId() {return id;} @Override public String toString() { return "Node id="+id+" height="+height+" slot="+slot+ " childWireLen="+getChildWireLength(); } public static void resetIds() {nodeCounter=1;} }