kicad-developers team mailing list archive
-
kicad-developers team
-
Mailing list archive
-
Message #05555
Re: exploiting human readability
Hi,
On Oct 5, 2010, at 19:26 PM, Brian Sidebotham wrote:
> On 5 October 2010 15:33, Dick Hollenbeck <dick@xxxxxxxxxxx> wrote:
>>
>> I get paid to brainstorm, so brace yourself.
>>
>> Continuing with library brainstorming, the following is put on the table
>> for consideration and eventual evaluation. Brace yourself, this is out
>> of the box. Open up your mind before proceeding.
>>
>> Remember the HTML editors which let you view HTML source and the
>> resultant GUI presentation at the same time? One panel has the html
>> source, another shows you its effects. The following concepts use that
>> UI paradigm. Use the source Luke, use the source.
>>
>>
>> A library is not a library file:
>> -------------------------------
>>
>> The concept of a *library file* is gone. There are none. The concept
>> of a library can still exist but it is a RAM resident concept. Each
>> component that we traditionally think of residing in a *library file* is
>> actually in its own file on disk in a directory (or repo or schematic).
>> A library is only built in RAM during the loading of a collection of
>> components.
I think this would be great. Does this mean we get 3 sorts of files?
symbol, footprint and part-files?
(symbol, e.g., a resistor,
component, e.g., a 10k 5% resister of .25W with footprint R025W
Part-files can be project specific or general. Parts can be created automatically when needed and in the simples form only has 2 include-lines (and perhaps a part-number, e.g., R1). You could add lines if you want gate-swapping.
>>
>>
>> Loading components:
>> ------------------
>>
>> The act of loading components utilizes the notion of inheritance and
>> classical file inclusion like the C++ #include. Let's go back an
>> understand inheritance thinking about Java. In a Java virtual machine
>> each class definition container has a method table. That table is
>> initially populated with methods from the base class. As the base class
>> is extended some of those methods are overloaded (replaced) with ones
>> from the derived class in the internal method table. Additional fields
>> can be introduced in derived classes also, into what is a field table
>> for that class. Now lets move that conceptual model to a component.
>> Lets assume we have a pin table, and a graphics table. We give a
>> component the ability to inherit from: 1) a base code fragment, or 2)
>> symbol or 3) component. In this case you can do pin additions, or pin
>> modifications, pin swapping, in the same way you can overload a Java
>> class's method table. Pins can be overloaded or replaced, and graphical
>> primitives can be inherited and extended.
Would we really need base-symbols and base-footprints? Meaning, do we want symbols that are derived from other symbols? Why not flatten all symbols and footprints? I *think* this would be much easier to use and maintain.
A part would be "derived" from both a symbol and a footprint, and you can overload some parts (e.g., which NAND to use in the 74LS00). Symbols could already be linked to footprints, such that when you select a symbol you get a list of footprints (you should be able to override this).
>>
>> The magic happens during the loading phase of the S-expressions, so that
>> the "built up" component is fully assembled in RAM by using pieces from
>> various places "out there", while *loading*.
>>
>> If desired, the various pieces can be ear-marked with their origins in
>> full recognition of the existence of inheritance. One might do this
>> only to facilitate graphical editing of a derived component, although if
>> the grammar is sweet enough, textual editing may be enough for all
>> editing of derived components.
>>
>> Re-loading is simply done by clicking a "parse" or "show" button. The
>> the parser reloads the source stream and does file inclusions as called
>> for. A portion of that source stream comes from the textual UI panel.
>> Inherited portions come from a library (which is now a RAM resident
>> concept only).
>>
>>
>> Example
>> -------
>>
>> (component SOMENAME
>> # inherit is like C++'s #include
>> (inherit SOMEOTHERNAME WHERE)
>> (pin 12 ... WHERE...ORIENTATION)
>> (pin 13 ... WHERE...ORIENTATION)
>> (pin 14 ...)
>> )
>>
>> Pin 12 and 13 are provided here and they are overloads because 12 and 13
>> have already been defined in SOMEOTHERNAME. So this could be the means
>> of a *pin swap*. However pin 14 is new, since SOMEOTHERNAME did not
>> have one, so this is an extension. In one example we see both a)
>> overloading and b) extension.
>>
>> This example would be a new SOMENAME component, and its graphics are
>> fully inherited from SOMEOTHERNAME, and can be extended here, but not
>> overloaded in any way that I can think up.
>>
>>
>> Where do they come from? and component versioning:
>> -------------------------------------------------
>> The ability to reference an external component by a GUID (globally
>> unique ID) of some kind lets you pull in components from anywhere in the
>> world. A GUID inherently needs to respect versioning. That is to say,
>> if you make an edit to a component that somebody else depends on, you
>> still have to provide the original version also.
>>
>> Enter the version control system. Since each component and component
>> source code fragment exists in its own file, a source code control
>> system is used to house these files, and they can be accessed by using a
>> SCCS repo, file name and version number, over the Internet, or locally.
>>
>> One possibility for this is to build a tcp socket oriented bridge into
>> Bazaar's access API, which I assume lets you access any version of any
>> archived file. Only one such server is needed for the "kicad supplied
>> libraries". Behind the scenes the bridge/server simply uses launchad's
>> bazaar based repo.
>>
>> The loading of code fragments from afar need to be cached in RAM, so the
>> concept of a *library* does not go away. A library is a RAM container
>> that caches those things coming from afar in order to enhance speed.
>> But remember, kicad supplied libraries are essentially "read only" (for
>> all but those with the generating scripts). So putting them under SCCS
>> and in launchpad as a primary place of dwelling is reasonable for those
>> with Internet access. Others could check out the library branch.
I think we should not code a VCS into kicad, but let the user choose which one to use. However, it makes sense to host one in SVN on launchpad.
>>
>>
>> How?
>> ----
>>
>> I can have this coded by Tuesday, given enough incentive. (I'm just not
>> going to say which Tuesday.)
>
> Includes would be awesome, and I think that having the source +
> graphical split would work very well.
>
> Some descriptors could be very generic. For example I first draw a
> generic op-amp package which results in a purely graphical symbol.
> Then I can create a set of components which include the graphical
> items from the symbol, and maybe do some pin mapping, footprint
> selection and include some spice parameters.
>
> Just thinking of future expansion and the possibility of using Spice
> simulation in KiCad, variable substitution might be nice to include
> the relevant spice parameters depending on what the user sets the
> value field to in the schematic.
>
> Assuming that variable substitution is evaluated between pairs of % symbols:
>
> e.g.:
> (component QUANDOPAMP
> (inherit QUADOPAMPSYMBOL)
> (inherit SPICE%Field:Value%)
> )
>
> So in the above, when I edit the value field in the schematic, the
> relevant spice parameters are included for the op-amp that I'm using
> (provided that the spice parameters can be found of course!) This
> would make evaluating different components really easy.
>
> Intelligent Components
> ---------------------
>
> This opens up a thought that you can do evaluation on components
> properties. A single resistor component could translate to several
> different parts in a schematic depending on the field values.
>
> For example, a generic resistor could set its own footprint field
> depending on the power field:
>
> (component RESISTOR
> (inherit ANSIRESSYBOL)
> (field Footprint
> (option 0.25W (footprint 025WRES) )
> (option 0.5W (footprint 050WRES) )
> (option DEFAULT (footprint 025WRES) )
> )
> )
I am not sure if this kind of intelligence does any good. Perhaps it does in another example, but I am not a great fan of a tool choosing the "best" option for me, because a lot of times it is simply wrong.
>
> I'm not sure this would be valid syntax, but hopefully you get the
> idea. Set the resistor power in eeschema and the footprint will be
> selected semi-automatically. Obviously more options can be inherited
> or inserted if the source of the component is available to edit.
>
> Possibly, we could have an equivalent of a switch statement in the part.
>
> I think inheritance could open up a world of possibilities...
>
> Best Regards,
>
> Brian.
/Martijn
References