freerouting/src/main/java/eu/mihosoft/freerouting/designformats/specctra/AutorouteSettings.java

325 lines
11 KiB
Java

/*
* 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.
*
* AutorouteSettings.java
*
* Created on 1. Maerz 2007, 07:10
*
*/
package designformats.specctra;
import datastructures.IndentFileWriter;
import datastructures.IdentifierType;
/**
*
* @author Alfons Wirtz
*/
public class AutorouteSettings
{
static interactive.AutorouteSettings read_scope(Scanner p_scanner, LayerStructure p_layer_structure)
{
interactive.AutorouteSettings result = new interactive.AutorouteSettings(p_layer_structure.arr.length);
boolean with_fanout = false;
boolean with_autoroute = true;
boolean with_postroute = true;
Object next_token = null;
for (;;)
{
Object prev_token = next_token;
try
{
next_token = p_scanner.next_token();
} catch (java.io.IOException e)
{
System.out.println("AutorouteSettings.read_scope: IO error scanning file");
return null;
}
if (next_token == null)
{
System.out.println("AutorouteSettings.read_scope: unexpected end of file");
return null;
}
if (next_token == Keyword.CLOSED_BRACKET)
{
// end of scope
break;
}
if (prev_token == Keyword.OPEN_BRACKET)
{
if (next_token == Keyword.FANOUT)
{
with_fanout = DsnFile.read_on_off_scope(p_scanner);
}
else if (next_token == Keyword.AUTOROUTE)
{
with_autoroute = DsnFile.read_on_off_scope(p_scanner);
}
else if (next_token == Keyword.POSTROUTE)
{
with_postroute = DsnFile.read_on_off_scope(p_scanner);
}
else if (next_token == Keyword.VIAS)
{
result.set_vias_allowed(DsnFile.read_on_off_scope(p_scanner));
}
else if (next_token == Keyword.VIA_COSTS)
{
result.set_via_costs(DsnFile.read_integer_scope(p_scanner));
}
else if (next_token == Keyword.PLANE_VIA_COSTS)
{
result.set_plane_via_costs(DsnFile.read_integer_scope(p_scanner));
}
else if (next_token == Keyword.START_RIPUP_COSTS)
{
result.set_start_ripup_costs(DsnFile.read_integer_scope(p_scanner));
}
else if (next_token == Keyword.START_PASS_NO)
{
result.set_pass_no(DsnFile.read_integer_scope(p_scanner));
}
else if (next_token == Keyword.LAYER_RULE)
{
result = read_layer_rule(p_scanner, p_layer_structure, result);
if (result == null)
{
return null;
}
}
else
{
ScopeKeyword.skip_scope(p_scanner);
}
}
}
result.set_with_fanout(with_fanout);
result.set_with_autoroute(with_autoroute);
result.set_with_postroute(with_postroute);
return result;
}
static interactive.AutorouteSettings read_layer_rule(Scanner p_scanner, LayerStructure p_layer_structure,
interactive.AutorouteSettings p_settings)
{
p_scanner.yybegin(SpecctraFileScanner.NAME);
Object next_token;
try
{
next_token = p_scanner.next_token();
} catch (java.io.IOException e)
{
System.out.println("AutorouteSettings.read_layer_rule: IO error scanning file");
return null;
}
if (!(next_token instanceof String))
{
System.out.println("AutorouteSettings.read_layer_rule: String expected");
return null;
}
int layer_no = p_layer_structure.get_no((String) next_token);
if (layer_no < 0)
{
System.out.println("AutorouteSettings.read_layer_rule: layer not found");
return null;
}
for (;;)
{
Object prev_token = next_token;
try
{
next_token = p_scanner.next_token();
} catch (java.io.IOException e)
{
System.out.println("AutorouteSettings.read_layer_rule: IO error scanning file");
return null;
}
if (next_token == null)
{
System.out.println("AutorouteSettings.read_layer_rule: unexpected end of file");
return null;
}
if (next_token == Keyword.CLOSED_BRACKET)
{
// end of scope
break;
}
if (prev_token == Keyword.OPEN_BRACKET)
{
if (next_token == Keyword.ACTIVE)
{
p_settings.set_layer_active(layer_no, DsnFile.read_on_off_scope(p_scanner));
}
else if (next_token == Keyword.PREFERRED_DIRECTION)
{
try
{
boolean pref_dir_is_horizontal = true;
next_token = p_scanner.next_token();
if (next_token == Keyword.VERTICAL)
{
pref_dir_is_horizontal = false;
}
else if (next_token != Keyword.HORIZONTAL)
{
System.out.println("AutorouteSettings.read_layer_rule: unexpected key word");
return null;
}
p_settings.set_preferred_direction_is_horizontal(layer_no, pref_dir_is_horizontal);
next_token = p_scanner.next_token();
if (next_token != Keyword.CLOSED_BRACKET)
{
System.out.println("AutorouteSettings.read_layer_rule: uclosing bracket expected");
return null;
}
} catch (java.io.IOException e)
{
System.out.println("AutorouteSettings.read_layer_rule: IO error scanning file");
return null;
}
}
else if (next_token == Keyword.PREFERRED_DIRECTION_TRACE_COSTS)
{
p_settings.set_preferred_direction_trace_costs(layer_no, DsnFile.read_float_scope(p_scanner));
}
else if (next_token == Keyword.AGAINST_PREFERRED_DIRECTION_TRACE_COSTS)
{
p_settings.set_against_preferred_direction_trace_costs(layer_no, DsnFile.read_float_scope(p_scanner));
}
else
{
ScopeKeyword.skip_scope(p_scanner);
}
}
}
return p_settings;
}
static void write_scope(IndentFileWriter p_file, interactive.AutorouteSettings p_settings,
board.LayerStructure p_layer_structure, IdentifierType p_identifier_type) throws java.io.IOException
{
p_file.start_scope();
p_file.write("autoroute_settings");
p_file.new_line();
p_file.write("(fanout ");
if (p_settings.get_with_fanout())
{
p_file.write("on)");
}
else
{
p_file.write("off)");
}
p_file.new_line();
p_file.write("(autoroute ");
if (p_settings.get_with_autoroute())
{
p_file.write("on)");
}
else
{
p_file.write("off)");
}
p_file.new_line();
p_file.write("(postroute ");
if (p_settings.get_with_postroute())
{
p_file.write("on)");
}
else
{
p_file.write("off)");
}
p_file.new_line();
p_file.write("(vias ");
if (p_settings.get_vias_allowed())
{
p_file.write("on)");
}
else
{
p_file.write("off)");
}
p_file.new_line();
p_file.write("(via_costs ");
{
Integer via_costs = p_settings.get_via_costs();
p_file.write(via_costs.toString());
}
p_file.write(")");
p_file.new_line();
p_file.write("(plane_via_costs ");
{
Integer via_costs = p_settings.get_plane_via_costs();
p_file.write(via_costs.toString());
}
p_file.write(")");
p_file.new_line();
p_file.write("(start_ripup_costs ");
{
Integer ripup_costs = p_settings.get_start_ripup_costs();
p_file.write(ripup_costs.toString());
}
p_file.write(")");
p_file.new_line();
p_file.write("(start_pass_no ");
{
Integer pass_no = p_settings.get_pass_no();
p_file.write(pass_no.toString());
}
p_file.write(")");
for (int i = 0; i < p_layer_structure.arr.length; ++i)
{
board.Layer curr_layer = p_layer_structure.arr[i];
p_file.start_scope();
p_file.write("layer_rule ");
p_identifier_type.write(curr_layer.name, p_file);
p_file.new_line();
p_file.write("(active ");
if (p_settings.get_layer_active(i))
{
p_file.write("on)");
}
else
{
p_file.write("off)");
}
p_file.new_line();
p_file.write("(preferred_direction ");
if (p_settings.get_preferred_direction_is_horizontal(i))
{
p_file.write("horizontal)");
}
else
{
p_file.write("vertical)");
}
p_file.new_line();
p_file.write("(preferred_direction_trace_costs ");
Float trace_costs = (float) p_settings.get_preferred_direction_trace_costs(i);
p_file.write(trace_costs.toString());
p_file.write(")");
p_file.new_line();
p_file.write("(against_preferred_direction_trace_costs ");
trace_costs = (float) p_settings.get_against_preferred_direction_trace_costs(i);
p_file.write(trace_costs.toString());
p_file.write(")");
p_file.end_scope();
}
p_file.end_scope();
}
}