add board internal units plan, first incomplete draft.
This commit is contained in:
parent
778832a665
commit
2fd8613777
|
@ -0,0 +1,125 @@
|
||||||
|
Proposed Plan for adding Nano Meters into PCBNEW as the Board Internal Unit
|
||||||
|
===========================================================================
|
||||||
|
|
||||||
|
General:
|
||||||
|
=======
|
||||||
|
|
||||||
|
With nano meters as the Board Internal Unit (BIU), a 32 bit signed integer can
|
||||||
|
only hold about 2 meters of positive length and 2 meters of negative length.
|
||||||
|
Moreover, because most of the bits within a 32 bit integer can be "used up" to
|
||||||
|
hold a typical length within a board, it is very likely that if pure 32 bit
|
||||||
|
integer math is done, such as the multiplication of two integers in order to
|
||||||
|
calculate a hypotenuse, then there will be an overflow within the 32 bit
|
||||||
|
integer. Another way to think of the BIU acronym is "Board Integer Unit" instead
|
||||||
|
of as Board Internal Unit.
|
||||||
|
|
||||||
|
Therefore all intermediate products, quotients, trig, and exponential
|
||||||
|
calculations should be done using some larger floating point type. Distances
|
||||||
|
that do not have to be rounded back to integer can and should stay as floating
|
||||||
|
point. The typedef name of this floating point type is BFU (Board Float Units).
|
||||||
|
The engineering units on a BFU are the same as on a BIU. A typedef is nice so
|
||||||
|
that we can toggle between double and "long double" for various compilations,
|
||||||
|
and so that when performing casts, these are brief.
|
||||||
|
|
||||||
|
There should be printf() style format strings for the BFU enclosed within
|
||||||
|
a #define and its name should be FMT_BFU. This format string will be used
|
||||||
|
at least for saving BOARD and MODULE files, and perhaps more. A define is needed
|
||||||
|
in case we switch between double and long double. BIUs will be scaled before
|
||||||
|
being written to disk in every case that I can think of, and since scaling is
|
||||||
|
a multiplication, it means casting one of the factors to BFU, and then this
|
||||||
|
product is output with a printf() style function using the FMT_BFU.
|
||||||
|
|
||||||
|
BIUs are only used when a BOARD or MODULE is in RAM. A BIU is equivalent to
|
||||||
|
either a 1) deci-mil or 2) nanometer, depending on how the source code is
|
||||||
|
compiled. Form 1) is needed only during the preparation phase of the source code
|
||||||
|
transition to nanometers. After the transition, only nanometers will be used in
|
||||||
|
the compilation. No runtime switching is needed or wanted. Again, BIUs can only
|
||||||
|
be one or the other for a given compilation, and this will swing based on a
|
||||||
|
single #define.
|
||||||
|
|
||||||
|
We may want to actually use "BIU" as our integer type in source code. This would
|
||||||
|
give us the ability to easily modify it. But it might also make the source code
|
||||||
|
more readable, and keep the type information out of the variable name. This
|
||||||
|
would mean having a point and/or size class based on BIU as the contained
|
||||||
|
integer types. I think this is a nice to have, but not immediately mandatory.
|
||||||
|
|
||||||
|
There will be a number of places within the source code which will have to be
|
||||||
|
doctored up to use the BFU casting. It will take some time to find all these
|
||||||
|
sites. During this time it should be possible to continue using deci-mils as the
|
||||||
|
BIU for source compilation.
|
||||||
|
|
||||||
|
There are a quite a number of path ways in and out of BOARDs and MODULEs. Most
|
||||||
|
everyone of these pathways involve conversion or scaling of BIUs. An example of
|
||||||
|
a pathway in is a BOARD disk file loading function. An example of a pathway out
|
||||||
|
of a BOARD is a disk file saving function. Likewise for MODULEs. We can
|
||||||
|
characterize the load and save functions by their source and destination
|
||||||
|
representations of lengths.
|
||||||
|
|
||||||
|
BOARDs and MODULEs will soon have a new format, which is basically the existing
|
||||||
|
format expressed in um or nm (TBD) rather than in deci-mils. For discussion, we
|
||||||
|
will say this new format is in mm, even though it may end up being in um. In
|
||||||
|
another year or two we will switch to s-expressions, or sooner if there is a
|
||||||
|
volunteer.
|
||||||
|
|
||||||
|
Here are the required immediate need BOARD load functions:
|
||||||
|
|
||||||
|
1) Legacy to deci-mil loader. This loader uses a floating point scaling factor
|
||||||
|
of unity, since destination is a RAM BOARD using deci-mils as its BIU.
|
||||||
|
|
||||||
|
2) Legacy to nanometer loader. This loader uses a floating point scaling factor
|
||||||
|
of ________, since destination is a RAM BOARD using nanometers as its BIU, and
|
||||||
|
the source format is using deci-mils.
|
||||||
|
|
||||||
|
3) mm to nanometer loader. This loader uses a floating point scaling factor
|
||||||
|
of 1000000, since the destination is a RAM BOARD using nanometers as its BIU.
|
||||||
|
|
||||||
|
There is no need for a nm to deci-mil loader. (Once somebody saves a file in the
|
||||||
|
new format, that format is used going forward, or its backup in the old format.)
|
||||||
|
|
||||||
|
Now duplicate the above 3 loader types for MODULEs.
|
||||||
|
|
||||||
|
Here are the required immediate need BOARD save functions:
|
||||||
|
|
||||||
|
1) deci-mil to deci-mil, using a floating point scaling factor of unity. It
|
||||||
|
should be possible to use trailing zero suppression on the deci-mils to get a
|
||||||
|
BOARD that is identical to an old BOARD, and this can be used to test the new
|
||||||
|
save function, using "diff" with whitespace ignore. This saver is only in play
|
||||||
|
when the BIU is compiled to be deci-mils.
|
||||||
|
|
||||||
|
2) nanometer to mm, using a floating point scaling factor of 1/1000000. This
|
||||||
|
saver is only in play when the BIU is compiled to be nanometers.
|
||||||
|
|
||||||
|
Now duplicate the above 3 saver types for MODULEs.
|
||||||
|
|
||||||
|
New BOARD and MODULE files will have a new field in them identifying the
|
||||||
|
engineering units used, say mm.
|
||||||
|
|
||||||
|
In actuality, the source code to all 3 loaders, and to all 3 savers can be the
|
||||||
|
same source code with a single variable in each case for scaling.
|
||||||
|
|
||||||
|
All 6 loaders and all 6 savers should be written in parallel with existing
|
||||||
|
loaders and savers for this same purpose, so that we can toggle usage back and
|
||||||
|
forth between the two for awhile. This means we do not gut existing savers and
|
||||||
|
loaders until the new ones are debugged and stable.
|
||||||
|
|
||||||
|
The new savers and loaders are to be done in the context of a plug-in
|
||||||
|
architecture, described elsewhere.
|
||||||
|
|
||||||
|
|
||||||
|
User Interface Changes:
|
||||||
|
======================
|
||||||
|
|
||||||
|
All these changes have to be done in a way where they hinge on one #ifdef.
|
||||||
|
|
||||||
|
*) The grid dimension choices will have to be changed.
|
||||||
|
|
||||||
|
*) The drawing routines will have to be changed to handle the case that BIU is
|
||||||
|
compiled to be nm. Work towards getting legacy drawing code capable of handling
|
||||||
|
a compile time #define to control a single scaling factor. Only the scaling
|
||||||
|
factor should need be changed in the final state. Up until then, the work
|
||||||
|
required is to inject the BFU casting where needed along with the scaling
|
||||||
|
factor(s).
|
||||||
|
|
||||||
|
8) Remove any funky imperial to metric conversion functions which tried to hide/mask
|
||||||
|
problems with lack of BIU precision.
|
||||||
|
|
Loading…
Reference in New Issue