english
version "1.0"
identify "%Z%%M% %I% %E%"
#: 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 board_data
#: This module implements a printed circuit board data abstraction.
define board_data #: Printed circuit board data
record
cells cells #: Matrix of {cell
} objects
changed logical #: {true
}=>board has changed
changed_east unsigned #: Rightmost changed cell
changed_north unsigned #: Topmost changed cell
changed_south unsigned #: Bottommost changed cell
changed_west unsigned #: Leftmost changed cell
character_chunks vector[chunk] #: Character to glyph table
character_chunks1 vector[chunk] #: Character to glyph table 1R
character_chunks2 vector[chunk] #: Character to glyph table 2R
character_chunks3 vector[chunk] #: Character to glyph table 3R
chunk_layers vector[chunk_layer] #: Other glyphs on board
cursor_thick chunk #: Thick cursor chunk
cursor_thin chunk #: Thin cursor chunk
debug_stream out_stream #: Debugging output stream
error_stream out_stream #: Error output stream
executable_directory string #: Directory containing exec.
file_name string #: File name
geometry geometry #: Current geometry of board
glyph_table glyph_table #: Glyph information table
glyph_table_read logical #: {true
}=>glyph table read
index2direction vector[direction] #: Conversion table
index2hole_number vector[chunk] #: Conversion table
index2inverted_hole_number vector[chunk] #: Conversion table
index2thick vector[chunk] #: Conversion table
index2thick_edge vector[chunk] #: Conversion table
index2thin vector[chunk] #: Conversion table
index2thin_edge vector[chunk] #: Conversion table
index2via_edge vector[chunk] #: Conversion table
name string #: Temporay hole name
over_bar chunk #: Over bar chunk
read_write_data read_write_data #: Write data helper
schematic_capture logical #: {true
}=schematic;else=>PCB
space chunk #: Space chunk
timer_segments timer
timer_characters timer
timer_chunks timer
timer_glyph timer
via_center chunk #: Via center chunk
via_center_named chunk #: Via center for named via
wire_connection chunk #: Wire connection chunk
generate allocate, erase, print
define geometry #: Board geometry information
record
cell_height unsigned #: Cell height in pixels
cell_width unsigned #: Cell width in pixels
cells_high unsigned #: Visible cell rows
cells_wide unsigned #: Visible cell columns
generate address_get, allocate, erase, identical, print
define read_write_data #: Reader data structure
record
relative_mode logical #: {true
}=>use (dx,dy) points
x_last unsigned #: Last x value read/written
y_last unsigned #: Last y value read/written
generate allocate, erase, print
#: {board_data
} routines:
procedure changed@board_data
takes
board_data board_data
x unsigned
y unsigned
returns_nothing
#: This procedure will extend the cell modification area in {board_data
}
#, to include cell ({x
}, {y
}). This routine assumes that the associated
#, cell has been marked as changed.
procedure character_chunks_insert@board_data
takes
board_data board_data
inverted logical
text string
name string
returns_nothing
#: This procedure will lookup the glyph associated with {name
}
#, and associate it with the first character in {text
}
#, for the {character_chunks
} field of {board_data
}. If {inverted
}
#, is {true
}, the character glyph is mirrored to support mirrored
#, board output.
#format@format5[unsigned, string, string, string, string](debug_stream,
# "n:%d% ch:%ds% ch1:%ds% ch2:%ds% ch3:%ds%\n\",
# number, character_chunks[number].glyph.name,
# character_chunks1[number].glyph.name,
# character_chunks2[number].glyph.name,
# character_chunks3[number].glyph.name)
procedure character_delete@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
returns logical
#: This procedure will delete that is one to the left of ({x
}, {y
})
#, in {layer
} of {board_data
}. {true
} is returned if the character
#, cursor should moved to the left by one and {false
} otherwise.
procedure character_extract@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
returns character
#: This procedure will return the {chunk_layer
} object associated
#, with the character at ({x
}, {y
}) in {layer
} of {board_data
}.
procedure character_find@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
returns character
#: This procedure will find and return the {character
} associated
#, with a character in {layer
} of {board_data
} at ({x
}, {y
}).
#, If there is no character in the position, ??@{character
}
#, is returned.
procedure character_first_find@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
returns unsigned
#: This procedure will find and return the position of the first
#, character in a sequence characters in {layer
} of {board_data
}
#, starting at ({x
}, {y
}). It is an error to call this routine
#, if ({x
}, {y
}) does not already point to an appropriate character.
procedure character_left_most_find@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
returns unsigned
#: This procedure will return the position of the left most
#, character of the string pointed to by ({x
}, {y]) in {layer
}
#, of {board_data
}. ({x
}, {y
}) must either be directly on the
#, string or one character to the right of the last character
#, in the string.
procedure character_insert@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
character character
returns logical
#: This procedure will attempt to insert {character
} into {layer
} of
#, {board_data
} at ({x
}, {y
}) if there is room. Any characters at
#, ({x
}, {y
}) and to the right will be moved right by one, unless
#, that would cause the right most character on the end to be
#, shifted off the edge of the board or be obstructed by a via.
#, If the characters to the right can not be moved right by one,
#, instead the characters to the left will be moved left by one,
#, unless that would cause the left most character to be shifted
#, off the edge of the board or be obstructed by a via. In this
#, last case, the characters are "jammed", and the glyph is not
#, inserted. {true
} is returned if the insertion point should be
#, moved to the right, and {false
} otherwise.
procedure character_is_empty@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
returns logical
#: This procedure will return {true
} if there is no character in {layer
}
#, of {board_data
} at ({x
}, {y]) and {false
} otherwise.
procedure character_is_present@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
returns logical
#: This procedure will return {true
} if there is a character in {layer
}
#, of {board_data
} at ({x
}, {y]) and {false
} otherwise.
procedure character_last_find@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
returns unsigned
#: This procedure will find and return the position of the last
#, character in a sequence characters in {layer
} of {board_data
}
#, starting at ({x
}, {y
}). It is an error to call this routine
#, if ({x
}, {y
}) does not already point to an appropriate character.
procedure character_move@board_data
takes
board_data board_data
layer layer
x_from unsigned
y_from unsigned
x_to unsigned
y_to unsigned
returns logical
#: This procedure will move the character at ({x_from
}, {y_from
})
#, in {layer
} of {board_data
} to ({x_to
}, {y_to
}). {true
} is
#, returned if the character is not successfully moved; and {false
}
#, otherwise.
procedure character_place@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
character character
returns_nothing
#: This procedure will place {character
} at ({x
}, {y]) in {layer
} of
#, {board_data
}.
procedure characters_is_empty@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
count unsigned
returns logical
#: This procedure will return {true
} if there are no characters
#, or vias in {layer
} of {board_data
} from ({x
}, {y
}) through
#, ({x
} , {y
} + {count
} - 1).
procedure characters_move@board_data
takes
board_data board_data
layer layer
x_from unsigned
y_from unsigned
x_to unsigned
y_to unsigned
count unsigned
returns logical
#: This procedure will move the {count
} characters in {layer
} of
#, {board_data
} starting at ({x_from
}, {y_from
}) over to
#, ({x_to
}, {y_to
}). Overlapping moves are permitted. {true
}
#, is returned if moving the characters would have caused a
#, character to be obstructed. {false
} is returned if there
#, were no problems moving the characters.
procedure chunk_layer_insert@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
name string
returns logical
#, {board_data
} at ({x
}, {y]). {true
} is returned if either
#, {name
} is not a known glyph name, or the glyph named {name
}
#, is already present at ({x
}, {y
}) in the same {layer
}. {true
}
#, is returned upon successful insertion of the glyph and {false
}
#, otherwise.
procedure chunk_layers_delete@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
returns_nothing
#, {layer
} of {board_data
} and delete them.
procedure clear@board_data
takes
board_data board_data
returns_nothing
#: This procudure will empty out {board_data
}.
procedure columns_size_get@board_data
takes
board_data board_data
returns unsigned
#: Return the number of rows in {board_data
}. All this means is that
#, at some point of time there was/is something at the returned row
#, size (minus one). It does not mean that there is something there
#, now.
procedure create@board_data
takes
file_name string
executable_directory string
schematic_capture logical
glyph_table glyph_table
debug_stream out_stream
error_stream out_stream
timer timer
returns board_data
#: This procedure will create and return a {board_data
} object.
#, If {schematic_capture
} is {true
}, the returned board is
#, used for schematic capture, otherwise it is used for printed circuit
#, board layout.
procedure glyph_file_read@board_data
takes
board_data board_data
inverted logical
returns logical
#: This procedure will read the glyph file for {board_data
}
#, and initialized some other tables in {board_data
}. If {inverted
}
#, is {true
}, the character glyphs will be mirrored to support
#, mirrored output files.
procedure line_draw@board_data
takes
board_data board_data
layer layer
x1 unsigned
y1 unsigned
x2 unsigned
y2 unsigned
thickness line_thickness
returns logical
#: This procedure will draw/erase/compliment a line of thickness
#, {thickness
} that starts at ({x1
}, {y2
}) to ({x2
}, {y2
}) on
#, {layer
} in {board_data
}. {true
}@{logical
} is, returned if
#, any errors occur; otherwise, {false
}@{logical
} is returned.
procedure line_operation@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
direction direction
length unsigned
thickness line_thickness
operation line_operation
returns_nothing
#: This procedure will draw/erase/compliment a line of thickness
#, {thickness
} that starts at ({x
}, {y
}) on {layer
} in {board_data
}
#, and goes in {direction
} for {length
} cells. If {operation
} is
#, {set
}, a line is drawn, if {operation
} is {clear
}, a line is erased,
#, and if {operation
} is {invert
}, the line is inverted.
procedure rows_size_get@board_data
takes
board_data board_data
returns unsigned
#: Return the number of rows in {board_data
}. All this means is that
#, at some point of time there was/is something at the returned row
#, size (minus one). It does not mean that there is something there
#, now.
procedure character_select@board_data
takes
board_data board_data
character character
returns chunk
#: This procedure will select the correct chunk to render
#, {character
} as.
#: {read_write_data
} procedures:
procedure unsigned_parse_x@read_write_data
takes
read_write_data read_write_data
line string
returns unsigned
#: This procedure will parse a number from the front of {string
}.
procedure unsigned_parse_y@read_write_data
takes
read_write_data read_write_data
line string
returns unsigned
#: This procedure will parse a number from the front of {string
}.
procedure read@board_data
takes
board_data board_data
in_stream in_stream
file_name string
inverted_image logical
error_stream out_stream
debug_stream out_stream
timer timer
returns logical
#: This procedure will read in and return a {board_data
} object
#, from the previously opened {in_stream
}. Glyph information
#, is entered into {glyph_table
}. If any errors occur, an error message
#, is output to {error_stream
} and ??@{board_data
} is returned. If
#, {inverted_image
} is {true
}, the characters in each string are
#, transposed to support the output of mirror images.
procedure read@board_data1[board_data]
takes
board_data board_data
in_stream in_stream
file_name string
inverted_image logical
error_stream out_stream
debug_stream out_stream
timer timer
returns logical
needs
procedure chunk_layer_insert@board_data
takes board_data, layer, unsigned, unsigned, string
returns logical
procedure characters_insert@board_data
takes board_data, layer,
unsigned, unsigned, logical, vector[unsigned]
returns logical
procedure connection_insert@board_data
takes board_data, unsigned, unsigned, unsigned
returns logical
procedure geometry_get@board_data
takes board_data
returns geometry
procedure line_draw@board_data
takes board_data,
layer, unsigned, unsigned, unsigned, unsigned, line_thickness
returns logical
procedure schematic_capture_set@board_data
takes board_data, logical
returns_nothing
procedure via_name_insert@board_data
takes board_data, unsigned, unsigned, unsigned, string
returns logical
procedure glyph_file_read@board_data
takes board_data, logical
returns logical
#: This procedure read in information from {in_stream
} and enter it
#, into {board_data
}. {in_stream
} has been previously opened.
#, {error_stream
}, {debug_stream
}, and {timer
} are used
#, for error messages, debugging message, memory allocation, and
#, performance tuning. {true
}@{logical
} is returned if any fatal
#, errors occur; otherwise, {false
}@{logical
} is returned.
procedure connection_insert@board_data
takes
board_data board_data
x unsigned
y unsigned
hole_number unsigned
returns logical
#: This procedure will insert a connection/via at ({x
}, {y
}) with
#, a hole number of {hole_number
} into {board_data
}. {true
}@{logical
}
#, is returned if there are any errors.
procedure via_name_delete@board_data
takes
board_data board_data
x unsigned
y unsigned
returns_nothing
#: This procedure will delete the named via at ({x
}, {y
}) in {board_data
}.
procedure via_name_insert@board_data
takes
board_data board_data
x unsigned
y unsigned
hole_number unsigned
name string
returns logical
#: This procedure will insert {name
} into a via at ({x
}, {y
})
#, with a hole number of {hole_number
} in {board_data
}. {true
}
#, is returned if an error occurs and {false
} otherwise. It is
#, erroneous to assign a name to a cell that is not already a via.
procedure layer_parse@string
takes
line string
returns layer
#: This procedure will parse a layer from the from of {string
}
procedure lop@string
takes
string string
returns character
#: This procedure will remove the first character from the beginning
#, of {string
}.
procedure characters_insert@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
inverted_image logical
characters vector[unsigned]
returns logical
#: This procedure will insert {characrters
} into {board_data
} at
#, ({x
},{y
},{layer
}). If {inverted_image
} is {true
}, the characters
#, will be transposed for support of mirror image output.
procedure unsigned_parse@string
takes
line string
returns unsigned
#: This procedure will parse a number from the front of {string
}.
procedure integer_parse@string
takes
line string
returns integer
#: This procedure will parse a signed integer from the front of {string
}.
procedure string_parse@string
takes
line string
returns string
#: This procedure will take the remainder of line and return a copy of it.
procedure space_skip@string
takes
line string
returns_nothing
#: This procedure will remove the space at the front of {line
}.
procedure region_clear@board_data
takes
board_data board_data
x_offset unsigned
y_offset unsigned
width unsigned
height unsigned
returns_nothing
#: This procedure will clear the {width
}+1 by {height
}+1 region of cells
#, in {board
} starting at ({x_offset
}, {y_offset
}).
procedure region_edge_clear@board_data
takes
board_data board_data
x_offset unsigned
y_offset unsigned
width unsigned
height unsigned
returns_nothing
#: This procedure will clear the line segment edges of the {width
}+1
#, by {height
}+1 region of cells in {board
} starting at
#, ({x_offset
}, {y_offset
}).
procedure region_copy@board_data
takes
from board_data
from_x unsigned
from_y unsigned
to board_data
to_x unsigned
to_y unsigned
width unsigned
height unsigned
returns_nothing
#: This procedure will copy the {width
}+1 by {height
}+1 region of cells
#, in {from
} starting at ({from_x
}, {from_y
}) to the same size
#, region of cells in {to
} at ({to_x
}, {to_y
}).
procedure read_conditional@board_data
takes
board_data board_data
file_name string
inverted_image logical
error_stream out_stream
debug_stream out_stream
timer timer
returns logical
#: This procedure will read in the contents of {file_name
} into
#, {board_data
}, if {file_name
} exists. Otherwise, {board_data
}
#, is left empty. If any errors occur, {true
}@{logical
} is returned,
#, otherwise, {false
}@{logical
} is returned. If {imverted_image
}
#, is {true
}, the characters in each string will be transposed to
#, support mirror image ouput.
procedure string_delete@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
returns logical
#: This procedure will delete the string at ({x
}, {y
}) in {layer
} of
#, {board_data
}. {true
} is returned if no string is present to be
#, deleted and {false
} otherwise.
procedure string_extract@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
name string
returns logical
#: This procedure will extract the string at ({x
}, {y
}) in {layer
} of
#, board and put it into {name
}. {true
} is returned if a string is
#, found and {false
} otherwise.
procedure via_invert@board_data
takes
board_data board_data
layer layer
x unsigned
y unsigned
returns_nothing
#: This procedure will add a via to {board_data
} at ({x
}, {y
}) if the
#, is none present, otherwise it will remove the via. {layer
} specifies
#, which layer to look for the hole number on. A via is plated
#, through hole from one side of the printed circuit board to the other.
procedure write@board_data
takes
board_data board_data
file_name string
debug_mode logical
cells_wide unsigned
cells_high unsigned
error_stream out_stream
returns_nothing
#: This procedure will write {board_data
} to the file named {file_name
}.
#, The contents of the file are in an ASCII format so that it is human
#, readable (editable.) If {file_name
} can not be opened, an error
#, message will be output to {error_stream
} and the file will be
#, written to a file in the current directory named {file_name
}.error.
#, Each (x,y) coordinate is output relative to the previous coordinate
#, in order to reduce the amount of changes recorded in the SCCS s.
#, files when a block move is performed.
procedure create@read_write_data
takes_nothing
returns read_write_data
#: This procedure will return a new {read_write_data
} object.
# {geometry
} routines:
procedure create@geometry
takes_nothing
returns geometry
#: This routine will create and return a {geometry
} object.
# Stand alone routines:
procedure has_pcb_suffix
takes
file_name string
returns logical
#: This procedure will return {true
} if {file_name
} has a suffix
#, of {.pcb
} and {false
} otherwise.
procedure has_sc_suffix
takes
file_name string
returns logical
#: This procedure will return {true
} if {file_name
} has a suffix
#, of {.sc
} and {false
} otherwise.