/*
* Copyright (C) 2014 Alfons Wirtz
* website www.freerouting.net
*
* This program 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.
*
* This program 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 at <http://www.gnu.org/licenses/>
* for more details.
*
* Net.java
*
* Created on 11. Juni 2004, 08:17
*/
package rules;
import board.Item;
import board.ObjectInfoPanel.Printable;
import datastructures.UndoableObjects;
/**
* Describes properties for an individual electrical net.
*
* @author Alfons Wirtz
*/
public class Net implements Comparable<Net>, board.ObjectInfoPanel.Printable, java.io.Serializable
{
/**
* Creates a new instance of Net.
* p_net_list is the net list, where this net belongs to.
*/
public Net(String p_name, int p_subnet_number, int p_no, Nets p_net_list, boolean p_contains_plane)
{
name = p_name;
subnet_number = p_subnet_number;
net_number = p_no;
contains_plane = p_contains_plane;
net_list = p_net_list;
net_class = p_net_list.get_board().rules.get_default_net_class();
}
public String toString()
{
return this.name;
}
/**
* Compares 2 nets by name.
* Useful for example to display nets in alphabetic order.
*/
public int compareTo(Net p_other)
{
return this.name.compareToIgnoreCase(p_other.name);
}
/** Returns the class of this net. */
public NetClass get_class()
{
return this.net_class;
}
/** Sets the class of this net */
public void set_class(NetClass p_rule)
{
this.net_class = p_rule;
}
/**
* Returns the pins and conduction areas of this net.
*/
public java.util.Collection<Item> get_terminal_items()
{
java.util.Collection<Item> result = new java.util.LinkedList<Item>();
board.BasicBoard board = this.net_list.get_board();
java.util.Iterator<UndoableObjects.UndoableObjectNode> it = board.item_list.start_read_object();
for (;;)
{
Item curr_item = (Item) board.item_list.read_object(it);
if (curr_item == null)
{
break;
}
if (curr_item instanceof board.Connectable)
{
if (curr_item.contains_net(this.net_number) && !curr_item.is_route())
{
result.add(curr_item);
}
}
}
return result;
}
/**
* Returns the pins of this net.
*/
public java.util.Collection<board.Pin> get_pins()
{
java.util.Collection<board.Pin> result = new java.util.LinkedList<board.Pin>();
board.BasicBoard board = this.net_list.get_board();
java.util.Iterator<UndoableObjects.UndoableObjectNode> it = board.item_list.start_read_object();
for (;;)
{
Item curr_item = (Item) board.item_list.read_object(it);
if (curr_item == null)
{
break;
}
if (curr_item instanceof board.Pin)
{
if (curr_item.contains_net(this.net_number))
{
result.add((board.Pin) curr_item);
}
}
}
return result;
}
/**
* Returns all items of this net.
*/
public java.util.Collection<board.Item> get_items()
{
java.util.Collection<board.Item> result = new java.util.LinkedList<board.Item>();
board.BasicBoard board = this.net_list.get_board();
java.util.Iterator<UndoableObjects.UndoableObjectNode> it = board.item_list.start_read_object();
for (;;)
{
Item curr_item = (Item) board.item_list.read_object(it);
if (curr_item == null)
{
break;
}
if (curr_item.contains_net(this.net_number))
{
result.add(curr_item);
}
}
return result;
}
/**
* Returns the cumulative trace length of all traces on the board belonging to this net.
*/
public double get_trace_length()
{
double cumulative_trace_length = 0;
java.util.Collection<Item> net_items = net_list.get_board().get_connectable_items(this.net_number);
for (Item curr_item : net_items)
{
if (curr_item instanceof board.Trace)
{
cumulative_trace_length += ((board.Trace) curr_item).get_length();
}
}
return cumulative_trace_length;
}
/**
* Returns the count of vias on the board belonging to this net.
*/
public int get_via_count()
{
int result = 0;
java.util.Collection<Item> net_items = net_list.get_board().get_connectable_items(this.net_number);
for (Item curr_item : net_items)
{
if (curr_item instanceof board.Via)
{
++result;
}
}
return result;
}
public void set_contains_plane(boolean p_value)
{
contains_plane = p_value;
}
/**
* Indicates, if this net contains a power plane.
* Used by the autorouter for setting the via costs to the cheap plane via costs.
* May also be true, if a layer covered with a conduction_area of this net is
* is a signal layer.
*/
public boolean contains_plane()
{
return contains_plane;
}
public void print_info(board.ObjectInfoPanel p_window, java.util.Locale p_locale)
{
Integer via_count = this.get_via_count();
double cumulative_trace_length = this.get_trace_length();
java.util.Collection<Item> terminal_items = this.get_terminal_items();
java.util.Collection<Printable> terminals = new java.util.LinkedList<Printable>();
terminals.addAll(terminal_items);
Integer terminal_item_count = terminals.size();
java.util.ResourceBundle resources =
java.util.ResourceBundle.getBundle("board.resources.ObjectInfoPanel", p_locale);
p_window.append_bold(resources.getString("net") + " ");
p_window.append_bold(this.name);
p_window.append_bold(": ");
p_window.append(resources.getString("class") + " ");
p_window.append(net_class.get_name(), resources.getString("net_class"), net_class);
p_window.append(", ");
p_window.append_objects(terminal_item_count.toString(), resources.getString("terminal_items_2"), terminals);
p_window.append(" " + resources.getString("terminal_items"));
p_window.append(", " + resources.getString("via_count") + " ");
p_window.append(via_count.toString());
p_window.append(", " + resources.getString("trace_length") + " ");
p_window.append(cumulative_trace_length);
p_window.newline();
}
/** The name of the net */
public final String name;
/**
* Used only if a net is divided internally because of fromto rules for example
* For normal nets it is always 1.
*/
public final int subnet_number;
/** The unique strict positive number of the net */
public final int net_number;
/** Indicates, if this net contains a power plane */
private boolean contains_plane;
/** The routing rule of this net */
private NetClass net_class;
/** The net list, where this net belongs to. */
public final Nets net_list;
}