/* * 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. * * PartLibrary.java * * Created on 23. Maerz 2005, 08:36 */ package designformats.specctra; /** * * @author Alfons Wirtz */ public class PartLibrary extends ScopeKeyword { /** Creates a new instance of PartLibrary */ public PartLibrary() { super("part_library"); } public boolean read_scope(ReadScopeParameter p_par) { Object next_token = null; for (;;) { Object prev_token = next_token; try { next_token = p_par.scanner.next_token(); } catch (java.io.IOException e) { System.out.println("PartLibrary.read_scope: IO error scanning file"); System.out.println(e); return false; } if (next_token == null) { System.out.println("PartLibrary.read_scope: unexpected end of file"); return false; } if (next_token == CLOSED_BRACKET) { // end of scope break; } if (prev_token == OPEN_BRACKET) { if (next_token == Keyword.LOGICAL_PART_MAPPING) { LogicalPartMapping next_mapping = read_logical_part_mapping(p_par.scanner); if (next_mapping == null) { return false; } p_par.logical_part_mappings.add(next_mapping); } else if (next_token == Keyword.LOGICAL_PART) { LogicalPart next_part = read_logical_part(p_par.scanner); if (next_part == null) { return false; } p_par.logical_parts.add(next_part); } else { skip_scope(p_par.scanner); } } } return true; } public static void write_scope(WriteScopeParameter p_par) throws java.io.IOException { library.LogicalParts logical_parts = p_par.board.library.logical_parts; if (logical_parts.count() <= 0) { return; } p_par.file.start_scope(); p_par.file.write("part_library"); // write the logical part mappings for (int i = 1; i <= logical_parts.count(); ++i) { library.LogicalPart curr_part = logical_parts.get(i); p_par.file.start_scope(); p_par.file.write("logical_part_mapping "); p_par.identifier_type.write(curr_part.name, p_par.file); p_par.file.new_line(); p_par.file.write("(comp"); for (int j = 1; j <= p_par.board.components.count(); ++j) { board.Component curr_compomnent = p_par.board.components.get(j); if (curr_compomnent.get_logical_part() == curr_part) { p_par.file.write(" "); p_par.file.write(curr_compomnent.name); } } p_par.file.write(")"); p_par.file.end_scope(); } // write the logical parts. for (int i = 1; i <= logical_parts.count(); ++i) { library.LogicalPart curr_part = logical_parts.get(i); p_par.file.start_scope(); p_par.file.write("logical_part "); p_par.identifier_type.write(curr_part.name, p_par.file); p_par.file.new_line(); for (int j = 0; j < curr_part.pin_count(); ++j) { p_par.file.new_line(); library.LogicalPart.PartPin curr_pin = curr_part.get_pin(j); p_par.file.write("(pin "); p_par.identifier_type.write(curr_pin.pin_name, p_par.file); p_par.file.write(" 0 "); p_par.identifier_type.write(curr_pin.gate_name, p_par.file); p_par.file.write(" "); Integer gate_swap_code = curr_pin.gate_swap_code; p_par.file.write(gate_swap_code.toString()); p_par.file.write(" "); p_par.identifier_type.write(curr_pin.gate_pin_name, p_par.file); p_par.file.write(" "); Integer gate_pin_swap_code = curr_pin.gate_pin_swap_code; p_par.file.write(gate_pin_swap_code.toString()); p_par.file.write(")"); } p_par.file.end_scope(); } p_par.file.end_scope(); } /** * Reads the component list of a logical part mapping. * Returns null, if an error occured. */ private LogicalPartMapping read_logical_part_mapping(Scanner p_scanner) { try { Object next_token = p_scanner.next_token(); if (!(next_token instanceof String)) { System.out.println("PartLibrary.read_logical_part_mapping: string expected"); return null; } String name = (String) next_token; next_token = p_scanner.next_token(); if (next_token != Keyword.OPEN_BRACKET) { System.out.println("PartLibrary.read_logical_part_mapping: open bracket expected"); return null; } next_token = p_scanner.next_token(); if (next_token != Keyword.COMPONENT_SCOPE) { System.out.println("PartLibrary.read_logical_part_mapping: Keyword.COMPONENT_SCOPE expected"); return null; } java.util.SortedSet <String> result = new java.util.TreeSet<String>(); for(;;) { p_scanner.yybegin(SpecctraFileScanner.NAME); next_token = p_scanner.next_token(); if (next_token == Keyword.CLOSED_BRACKET) { break; } if (!(next_token instanceof String)) { System.out.println("PartLibrary.read_logical_part_mapping: string expected"); return null; } result.add((String) next_token); } next_token = p_scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("PartLibrary.read_logical_part_mapping: closing bracket expected"); return null; } return new LogicalPartMapping(name, result); } catch (java.io.IOException e) { System.out.println("PartLibrary.read_logical_part_mapping: IO error scanning file"); return null; } } private LogicalPart read_logical_part(Scanner p_scanner) { java.util.Collection<PartPin> part_pins = new java.util.LinkedList<PartPin>(); Object next_token = null; try { next_token = p_scanner.next_token(); } catch (java.io.IOException e) { System.out.println("PartLibrary.read_logical_part: IO error scanning file"); return null; } if (!(next_token instanceof String)) { System.out.println("PartLibrary.read_logical_part: string expected"); return null; } String part_name = (String) next_token; for (;;) { Object prev_token = next_token; try { next_token = p_scanner.next_token(); } catch (java.io.IOException e) { System.out.println("PartLibrary.read_logical_part: IO error scanning file"); return null; } if (next_token == null) { System.out.println("PartLibrary.read_logical_part: unexpected end of file"); return null; } if (next_token == CLOSED_BRACKET) { // end of scope break; } boolean read_ok = true; if (prev_token == OPEN_BRACKET) { if (next_token == Keyword.PIN) { PartPin curr_part_pin = read_part_pin(p_scanner); if (curr_part_pin == null) { return null; } part_pins.add(curr_part_pin); } else { skip_scope(p_scanner); } } if (!read_ok) { return null; } } return new LogicalPart(part_name, part_pins); } private PartPin read_part_pin(Scanner p_scanner) { try { p_scanner.yybegin(SpecctraFileScanner.NAME); Object next_token = p_scanner.next_token(); if (!(next_token instanceof String)) { System.out.println("PartLibrary.read_part_pin: string expected"); return null; } String pin_name = (String) next_token; next_token = p_scanner.next_token(); if (!(next_token instanceof Integer)) { System.out.println("PartLibrary.read_part_pin: integer expected"); return null; } p_scanner.yybegin(SpecctraFileScanner.NAME); next_token = p_scanner.next_token(); if (!(next_token instanceof String)) { System.out.println("PartLibrary.read_part_pin: string expected"); return null; } String gate_name = (String) next_token; next_token = p_scanner.next_token(); if (!(next_token instanceof Integer)) { System.out.println("PartLibrary.read_part_pin: integer expected"); return null; } int gate_swap_code = (Integer) next_token; p_scanner.yybegin(SpecctraFileScanner.NAME); next_token = p_scanner.next_token(); if (!(next_token instanceof String)) { System.out.println("PartLibrary.read_part_pin: string expected"); return null; } String gate_pin_name = (String) next_token; next_token = p_scanner.next_token(); if (!(next_token instanceof Integer)) { System.out.println("PartLibrary.read_part_pin: integer expected"); return null; } int gate_pin_swap_code = (Integer) next_token; // overread subgates for (;;) { next_token = p_scanner.next_token(); if (next_token == Keyword.CLOSED_BRACKET) { break; } } return new PartPin(pin_name, gate_name, gate_swap_code, gate_pin_name, gate_pin_swap_code); } catch (java.io.IOException e) { System.out.println("PartLibrary.read_part_pin: IO error scanning file"); return null; } } public static class LogicalPartMapping { private LogicalPartMapping(String p_name, java.util.SortedSet<String> p_components) { name = p_name; components = p_components; } /** The name of the maopping. */ public final String name; /** The conponents belonging to the mapping. */ public final java.util.SortedSet<String> components; } public static class PartPin { private PartPin(String p_pin_name, String p_gate_name, int p_gate_swap_code, String p_gate_pin_name, int p_gate_pin_swap_code) { pin_name = p_pin_name; gate_name = p_gate_name; gate_swap_code = p_gate_swap_code; gate_pin_name = p_gate_pin_name; gate_pin_swap_code = p_gate_pin_swap_code; } public final String pin_name; public final String gate_name; public final int gate_swap_code; public final String gate_pin_name; public final int gate_pin_swap_code; } public static class LogicalPart { private LogicalPart(String p_name, java.util.Collection<PartPin> p_part_pins) { name = p_name; part_pins = p_part_pins; } /** The name of the maopping. */ public final String name; /** The pins of this logical part */ public final java.util.Collection<PartPin> part_pins; } }