/* * 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. * * BoardLibrary.java * * Created on 4. Juni 2004, 06:37 */ package library; import java.util.List; import java.util.Vector; /** * Describes a board library of packages and padstacks. * * @author alfons */ public class BoardLibrary implements java.io.Serializable { /** Creates a new instance of BoardLibrary */ public BoardLibrary(Padstacks p_padstacks, Packages p_packages) { padstacks = p_padstacks; packages = p_packages; logical_parts = new LogicalParts(); } /** Creates a new instance of BoardLibrary */ public BoardLibrary() { } /** Sets the subset of padstacks from this.padstacks, which can be used in routing for inserting vias. */ public void set_via_padstacks(Padstack[] p_padstacks) { this.via_padstacks = new Vector<Padstack>(); for (int i = 0; i < p_padstacks.length; ++i) { this.via_padstacks.add(p_padstacks[i]); } } /** The count of padstacks from this.padstacks, which can be used in routing */ public int via_padstack_count() { if (this.via_padstacks == null) { return 0; } return this.via_padstacks.size(); } /** Gets the via padstack for routing with index p_no */ public Padstack get_via_padstack(int p_no) { if (this.via_padstacks == null || p_no < 0 || p_no >= this.via_padstacks.size()) { return null; } return this.via_padstacks.get(p_no); } /** Gets the via padstack with name p_name, or null, if no such padstack exists. */ public Padstack get_via_padstack(String p_name) { if (this.via_padstacks == null) { return null; } for(Padstack curr_padstack : this.via_padstacks) { if (curr_padstack.name.equals(p_name)) { return curr_padstack; } } return null; } /** * Returns the via padstacks, which can be used for routing. */ public Padstack[] get_via_padstacks() { if (this.via_padstacks == null) { return new Padstack[0]; } Padstack[] result = new Padstack[via_padstacks.size()]; for (int i = 0; i < result.length; ++i) { result[i] = via_padstacks.get(i); } return result; } /** * Apppends p_padstack to the list of via padstacks. * Returns false, if the list contains already a padstack with p_padstack.name. */ public boolean add_via_padstack(Padstack p_padstack) { if (get_via_padstack(p_padstack.name) != null) { return false; } this.via_padstacks.add(p_padstack); return true; } /** * Removes p_padstack from the via padstack list. * Returns false, if p_padstack was not found in the list. * If the padstack is no more used on the board, it will also be removed from the board padstacks. */ public boolean remove_via_padstack(Padstack p_padstack, board.BasicBoard p_board) { boolean result = via_padstacks.remove(p_padstack); return result; } /** * Gets the via padstack mirrored to the back side of the board. * Returns null, if no such via padstack exists. */ public Padstack get_mirrored_via_padstack(Padstack p_via_padstack) { int layer_count = this.padstacks.board_layer_structure.arr.length; if (p_via_padstack.from_layer() == 0 && p_via_padstack.to_layer() == layer_count - 1) { return p_via_padstack; } int new_from_layer =layer_count - p_via_padstack.to_layer() - 1; int new_to_layer = layer_count - p_via_padstack.from_layer() - 1; for (Padstack curr_via_padstack : via_padstacks) { if (curr_via_padstack.from_layer() == new_from_layer && curr_via_padstack.to_layer() == new_to_layer) { return curr_via_padstack; } } return null; } /** * Looks, if the input padstack is used on p_board in a Package or in drill. */ public boolean is_used (Padstack p_padstack, board.BasicBoard p_board) { java.util.Iterator<datastructures.UndoableObjects.UndoableObjectNode> it = p_board.item_list.start_read_object(); for(;;) { datastructures.UndoableObjects.Storable curr_item = p_board.item_list.read_object(it); if (curr_item == null) { break; } if (curr_item instanceof board.DrillItem) { if (((board.DrillItem) curr_item).get_padstack() == p_padstack) { return true; } } } for (int i = 1; i <= this.packages.count(); ++i) { Package curr_package = this.packages.get(i); for (int j = 0; j < curr_package.pin_count(); ++j) { if(curr_package.get_pin(j).padstack_no == p_padstack.no) { return true; } } } return false; } public Padstacks padstacks = null; public Packages packages = null; /** Containes information for gate swap and pin swap in the Specctra-dsn format. */ public LogicalParts logical_parts = new LogicalParts(); /** The subset of padstacks in the board library, which can be used in routing for inserting vias. */ private List<Padstack> via_padstacks = null; }