english
version "1.0"
identify "xyz"
#: Copyright (c) 1995, 1997, 2003 by Wayne C. Gramlich.
#, All rights reserved.
#,
#, Permission to use, copy, modify, distribute, and sell this software
#, for any purpose is hereby granted without fee provided that the above
#, copyright notice and this permission are retained. The author makes
#, no representations about the suitability of this software for any purpose.
#, It is provided "as is" without express or implied warranty.
module check
#: This module implement some code for laying out printed circuit boards
#, doing schematic capture.
procedure check
takes
executable_directory string
file_names vector[string]
glyph_table glyph_table
wire_list_file string
error_stream out_stream
debug_stream out_stream
timer timer
returns logical
#: This procedure will examine all of the files in {file_names}
#, for any inconsistencies. {true} is returned if any errors
#, have occured.
procedure board_parts_power_extract
takes
board_parts vector[board_part]
wire_list vector[vector[component_lead]]
returns_nothing
#: This procedure will extract all implied Vcc and Ground
#, connections from {board_parts} and add them to {wire_list}.
procedure power_extract@board_part
takes
board_part board_part
ground_wire vector[component_lead]
vcc_wire vector[component_lead]
junction junction
returns_nothing
#: This procedure will extract the implied Vcc and Ground wires
#, from each {part_lead} in {part_leads} and add them to {ground_wire}
#, or {vcc_wire} as appropriate.
procedure component_leads_check
takes
component_leads vector[component_lead]
board_part_table table[string, board_part]
error_stream out_stream
returns logical
#: This procedure will check {component_leads} for signal mismatches.
#, exists and the signals are all compatible with one another.
procedure component_leads_duplicates
takes
component_leads vector[component_lead]
component_leads_set set[component_lead]
error_stream out_stream
returns logical
#: This procedure will check {component_leads} for signal mismatches.
#, exists and the signals are all compatible with one another.
procedure wire_list_check
takes
wire_list vector[vector[component_lead]]
board_part_table table[string, board_part]
error_stream out_stream
returns logical
#: This procedure will check {wire_list} looking for signal type
#, mismatches.
procedure wire_list_duplicates
takes
wire_list vector[vector[component_lead]]
error_stream out_stream
returns logical
#: This procedure will check {wire_list} looking for duplicated
#, component leads. If any duplicates are found, an error message
#, is output to {error_stream}, and {true} is returned, otherwise
#, {false} is returned.
procedure wire_list_reduce
takes
wire_list vector[vector[component_lead]]
error_stream out_stream
debug_stream out_stream
returns logical
#: This procedure will merge together any wires in {wire_list} with
#, the same name. Any wires that are stand-alone are listed as error
#, messages to {error_stream}. If any errors are output, {true] is
#, returned; otherwise, {false} is returned.
procedure component_leads_append
takes
to_component_leads vector[component_lead]
from_component_leads vector[component_lead]
returns_nothing
#: This procedure will append the wires from {from_component_leads}
#, to {to_component_leads} skipping over any wire names.
procedure wire_list_output
takes
wire_list vector[vector[component_lead]]
out_stream out_stream
returns_nothing
#: This procedure will output {wire_list} to {out_stream}.
procedure component_leads_output
takes
component_leads vector[component_lead]
out_stream out_stream
returns_nothing
#: This procedure will output {wire_list} to {out_stream}.
#: {component} routines:
procedure create@component
takes
diagram diagram
name string
returns component
#: This procedure will create and return a new {component} object.
procedure leads_find@component
takes
component component
x_minimum unsigned
y_minimum unsigned
x_maximum unsigned
y_maximum unsigned
direction direction
returns logical
#: This procedure will find any component leads for {component} along
#, the line segment starting from ({x_minimum}, {y_minimum}) to
#, ({x_maximum}, {y_maximum}). The line segment must be a vertical
#, or horizontal line segment. Wires on the {direction} side of the
#, line segment are examined.
#: {component_lead} routines:
procedure compare@component_lead
takes
component_lead1 component_lead
component_lead2 component_lead
returns integer
#: This will compare {component_lead1} to {component_lead2} and
#, return -1, 0, 1 depending upon whether {component_lead1} is
#, less than, equal to, or greater than {component_lead2}.
procedure create@component_lead
takes
component component
junction junction
name string
returns component_lead
#: This procedure will create and return a new {component_lead} object
#, and containing {junction}, {component}, and {name}.
procedure equal@component_lead
takes
component_lead1 component_lead
component_lead2 component_lead
returns logical
#: This procedure will return {true} if {component_lead1} equals
#, {component_lead2} and {false} otherwise.
procedure hash@component_lead
takes
component_lead component_lead
returns unsigned
#: This procedure will return a hash value for {component_lead}.
procedure output@component_lead
takes
component_lead component_lead
out_stream out_stream
returns_nothing
#: This procedure will output {component_lead} to {out_stream}.
procedure parts_lookup@component_lead
takes
component_lead component_lead
board_part_table table[string, board_part]
returns_nothing
#: This procedure will lookup all of the board parts and part leads
#, for {component_lead}.
#else
# put@('Board part not found\n\', error_stream)
procedure wire_name@component_lead
takes
component_lead component_lead
returns string
#: This procedure will return the wire name for {component_lead}
#, of the empty string, depending upon whether {component_lead} is
#, a wire name or not.
#: {diagram_glyph} routines:
procedure leads_find@diagram_glyph
takes
diagram_glyph diagram_glyph
component component
returns logical
#: This procedure will find any wires connected to leads associated
#, with {diagram_glyph} and attach them to {component}. {true} is
#, returned if any errors are found, and {false} otherwise.
procedure name_find@diagram_glyph
takes
diagram_glyph diagram_glyph
component component
component_only logical
returns logical
#: This procedure will search for a component name around {diagram_glyph},
#, mark it as used, insert it into {component} as its name and return
#, {false}. If {component_only} is {true}, a scan is made to see whether
#, there is exactly one component name; if so, the component name is
#, grabbed and {false} is returned. If {component_only} is {false}
#, and exactly one component name is *not* found, an error message is
#, is generated and {true} is returned.
#: {diagram_text} routines:
procedure is_wire_label@diagram_text
takes
diagram_text diagram_text
board_part_table table[string, board_part]
returns logical
#: This procedure will deterimine whether {diagram_text} is a wire label.
#, {true} is returned if it is and {false} otherwise.
procedure wire_label_make@diagram_text
takes
diagram_text diagram_text
point point
board_part_table table[string, board_part]
returns_nothing
#: This procedure will create a wire label for {diagram_text} at {point}.
#: {junction} routines:
procedure create@junction
takes
diagram diagram
point point
junctions vector[junction]
returns junction
#: This procedure will create and return a new junction object
#, in {diagram} and containing {point} {point} ust be immutable.
#, The newly allocated {junction} object is appended to {junctions}.
procedure label_find@junction
takes
junction junction
component component
x1 unsigned
y1 unsigned
x2 unsigned
y2 unsigned
returns_nothing
#: This procedure will search the cells from ({x1}, {y1}) to ({x2}, {y2})
#, looking for a label for a glyph lead in {diagram}. {x1} must be less
#, than {x2} and {y1} must be less than {y2}.
#: {diagram} routines:
procedure component_boxes_extract@diagram
takes
diagram diagram
board_part_table table[string, board_part]
returns logical
#: This procedure will extract the component boxes from {diagram}
#, and store the result back into {diagram}. {true} is returned
#, if any errors occur and {false} otherwise.
procedure component_glyphs_extract@diagram
takes
diagram diagram
board_part_table table[string, board_part]
returns logical
#: This procedure will extract the component glyphs from {diagram}
#, and store the result back into {diagram}. {true} is returned
#, if any errors occur and {false} otherwise.
procedure components_extract@diagram
takes
diagram diagram
board_part_table table[string, board_part]
returns logical
#: This procedure will extract the component boxes and glyphs from
#, {diagram} and store the result back into {diagram}. {true} is
#, returned if any errors occur and {false} otherwise.
procedure chunk_layer_insert@diagram
takes
diagram diagram
layer layer
x unsigned
y unsigned
name string
returns logical
#: This procedure will insert the chunk named {name} into {diagram} at
#, ({x}, {y}) in {layer}. {false}@{logical} is returned if any errors
#, occur; otherwise, {true@{logical} is returned. (This is insconsistent
#, with the other routines.)
procedure characters_insert@diagram
takes
diagram diagram
layer layer
x unsigned
y unsigned
inverted_image logical
characters vector[unsigned]
returns logical
#: This procedure will insert {characters} into {diagram} at ({x}, {y})
#, in {layer}. {true}@{logical} is returned if any errors occur;
#, otherwise, {false}@{logical} is returned.
procedure connection_insert@diagram
takes
diagram diagram
x unsigned
y unsigned
hole_number unsigned
returns logical
#: This procedure will insert a via/connection into {diagram}
#, at ({x}, {y]) with a hole number of {hole_number}.
#, {true}@{logical} is returned if any errors occur;
#, otherwise, {false}@{lobical} is returned.
procedure glyph_file_read@diagram
takes
file_name string
inverted logical
returns logical
#: This procedure is a place holder needed for {read}@{board_data1}.
#, {false} is returned to indicate no errors have occured. Both
#, arguments are ignored.
procedure via_name_insert@diagram
takes
diagram diagram
x unsigned
y unsigned
hole_number unsigned
name string
returns logical
#: This procedure will insert a via named {name} at ({x}, {y}) with
#, a hole number of {hole_number} in {diagram}.
procedure create@diagram
takes
file_name string
glyph_table glyph_table
error_stream out_stream
debug_stream out_stream
returns diagram
#: This procedure creates and returns a new {diagram} object
#, that has been initialized to contain {file_name},
#, {glyph_table}, {error_stream}, and {debug_stream}.
procedure junction_lookup@diagram
takes
diagram diagram
x unsigned
y unsigned
junctions vector[junction]
table table[point, junction]
returns junction
#: This procedure will lookup the junction associated with the point
#, ({x}, {y}) in {table}. If no such {junction} exists, a new junction
#, will be created, inserted into {table}, and appended to {junctions}.
#, {diagram} is used to provide a temporary lookup {point} object, as
#, well as it is needed in any newly created {junction} object.
procedure labels_wrapup@diagram
takes
diagram diagram
board_part_table table[string, board_part]
returns logical
#: This procedure will iterate through all of the unused labels
#, in {diagram} and either cause the label to be attached to
#, an unterminate wire or report the label as unsued. {true}
#, is returned if any errors are reported and {false} otherwise.
procedure line_draw@diagram
takes
diagram diagram
layer layer
x1 unsigned
y1 unsigned
x2 unsigned
y2 unsigned
line_thickness line_thickness
returns logical
#: This procedure will insert a line between ({x1}, {y1}) to ({x2}, {y2})
#, {layer} of {diagram} with a line of thickness {line_thickness}.
#, {true}@{logical} is returned if any errors occur; otherwise,
#, {false}@{lobical} is returned.
procedure unterminated_wires_find@diagram
takes
diagram diagram
returns logical
procedure vias_label@diagram
takes
diagram diagram
board_part_table table[string, board_part]
error_stream out_stream
returns logical
#: This procedure will find all of the component leads in diagram
#, and label the appropriate vias.
procedure wire_list_extract@diagram
takes
diagram diagram
wire_list vector[vector[component_lead]]
layer layer
returns_nothing
#: This procedure will extract the wire list from {diagram} and
#, append it to {wire_list}.
procedure meshes_extract@diagram
takes
diagram diagram
layer layer
text string
double_sided logical
returns_nothing
#: This procedure will visit each wire on {layer} and figure out which
#, ones are connected to one another. Each group of connected wires
#, will be inserted into a {mesh} object. The list of {mesh} objects
#, is stored back in {diagram}. If {double_sided} is {true}, vias
#, that go through the board will be spanned as well.
procedure meshes_show@diagram
takes
diagram diagram
layer layer
text string
returns_nothing
#: This procedure will output {meshes} to {out_stream} with a
#, label of {text}.
#: {mesh} routines:
procedure bounds_update@mesh
takes
mesh mesh
point point
returns_nothing
#: This procedure will update the bounding box information in {mesh}
#, to include {point}.
procedure component_leads_extract@mesh
takes
mesh mesh
debug_stream out_stream
returns vector[component_lead]
#: This procedure will return the component leads list associated
#, with {mesh}.
#, it will get duplicated in the list. We just cull out duplicates
#, here:
procedure component_leads_show
takes
component_leads vector[component_lead]
debug_stream out_stream
returns_nothing
#: This procedure will show {component_leads} with a label of {text}
#, output to {debug_stream}.
procedure create@mesh
takes
diagram diagram
wire wire
returns mesh
#: This procedure will create and return a new {mesh} object
#, that contains {diagram} and {wire}.
procedure old_component_leads_aextract@mesh
takes
mesh mesh
component_leads vector[component_lead]
out_stream out_stream
returns_nothing
#: This procedure will output each component lead in {mesh} to
#, {out_stream}. {component_leads} is a temporary vector of
#, component leads.
procedure expand@mesh
takes
mesh mesh
wires vector[wire]
main_table table[point, junction]
other_table table[point, junction]
indent string
returns_nothing
#: This procedure will recursively add each wire in {wires} to {mesh}
#, if it is not already in {mesh}. {main_table} and {other_table}
#, are the tables used to look up wires for double sided boards.
#put@("]", debug_stream)
#trim@(indent, indent_size)
procedure has_line@mesh
takes
mesh mesh
x1 unsigned
y1 unsigned
x2 unsigned
y2 unsigned
table table[point, junction]
returns logical
#: This procedure will return {true}@{logical} if {mesh} as a
#, connected sequence of wires/lines that form a straight vertical
#, or horizontal line connecting ({x1}, {y1}) to ({x2}, {y2}).
#, This routine requires that {x1} <= {x2} and {y1} <= {y2}.
#, that connect ({x1}, {y1}) to ({x2}, {y2}) in a straight line:
procedure is_enclosed_box@mesh
takes
mesh mesh
table table[point, junction]
returns logical
#: This procedure will return {true}@{logical} if there is a box of
#, wires/lines around all of the wires in {mesh} and {false}@{logical}
#, otherwise.
procedure show@mesh
takes
mesh mesh
out_stream out_stream
returns_nothing
#: This procedure will output the contents of {mesh} to {out_stream}.
procedure wire_insert@mesh
takes
mesh mesh
wire wire
returns_nothing
#: This procedure will insert {wire} into {mesh}.
#debug_stream :@= mesh.diagram.debug_stream
#format@format1[address](debug_stream,
# "\t\wire_insert@mesh: address:%X% ", mesh.address)
#show@(wire, debug_stream)
#put@("\n\", debug_stream)
#: {point} routines:
procedure create@point
takes
x unsigned
y unsigned
returns point
#: This procedure will create and return a new {point} object
#, containing the coordinate ({x}, {y}).
#: {wire} routines:
procedure create@wire
takes
wires vector[wire]
junction1 junction
junction2 junction
returns wire
#: This procedure will create and return a wire consisting of {junction1}
#, and {junction2}.
procedure show@wire
takes
wire wire
out_stream out_stream
returns_nothing
#: This procedure will output {wire} to {out_stream} without any
#, preceeding or following whitespace.