This page hosts a proposal for work packages, which are supposed to
bring Kicad in par with the features of proprietary software that are
required for designing boards of similar complexity to our SPEC/SVEC
1. Unified geometry library
Type*: framework/library Goal*: clean up existing geometry routines. Add functionality
necessary for more advanced DRC and P&S. Depends on*: none. First client*: P&S router Status*: Started. Bare minimum required for P&S implemented. Specific release*: along with the P&S router.
A one-library-to-rule-them-all for spatial indexing and geometry
operations on 2D shapes. Specification
2. Push and Shove router
Type*: tool Goal*: modern routing tool. Depends on*: geometry library Status*: C** demo available. Specific release*: pcbnew with P&S route tool
The initial aim is do develop a simple push & shove router and integrate
it with existing pcbnew codebase, without any dependencies on the new
view, etc. The requirements are:
routing single tracks with clearances as specified in the design
walk-around and shove modes (for tracks).
initial version will have no via/component shoving support.
routing engine performs intermediate calculations on its internal
model and updates the main (BOARD) model whenever a 'stable' routing
routing engine might run in a separate thread, to make it more
3. View component
Type*: framework/library Depends on*: none Goal*: robust display layer for all Kicad applications, based on the
GAL. Refactoring towards clean MVC model. First client*: tool framework Status*: demo available. Integrating into pcbnew. Specific release*: pcbnew (and later on, all apps) with the new
Graphical item view for all Kicad applications, based on the Graphics
Improve the GAL, so that it is capable of rendering a complex board
on entry-level hardware. Initially, support two GAL backends:
- OpenGL for 'normal' work. Must be extremely fast, things like
anti-aliasing are second priority here.
- Cairo for high quality rendering, bitmap export and maybe
Integrate the VIEW in pcbnew. First stage of integration will result
in non-editable view, that can be switched with the legacy one
during run time.
Second stage will come up with a fully functional VIEW, but will
require significant refactoring in the tool code. The reason is that
tools use a lot of XOR rendering to erase items off the screen,
which is not compatible with any reasonably modern rendering
Allow users to select own layer color scheme, layer transparency,
drawing order, contrast and wireframe/solid rendering mode.
Given the experience gained with pcbnew, redo gerbview and
schematics in the same manner.
After a review & testing period, remove legacy rendering from Kicad
Refactor printing to use the GAL (via either wxDC or cairo). Cairo
provides native printing (via GDI+) on Windows and a PS filter for
Linux/OSX. Use native GTK printing dialog under Linux (default in wx
(extra) evaluate the View class interface extensions that would
enable native 3D editing.
Type*: framework/library Depends on*: View component Goal*: Conflict-less way of developing tools. Script-driven tools.
Refactoring towards clean MVC model. First client*: P&S router Status*: planning Specific release*: pcbnew with fully functional P&S.
Currently all editing tools in pcbnew reside in a single, enormous class
(PCB_EDIT_FRAME) entangled with numerous editing methods in the model
& a bunch of global/static functions and variables. Such code is very
difficult to maintain and extend.
Each tool belongs to one of following categories:
- interactive, such as a PCB router - that once activated take a
group of keyboard/mouse events and process them until an exit event
is received. Only one interactive tool can be active at a time.
- batch, which are run once in response to a UI/Scripting command
(such as DRC)
- background - background tasks that are always active and filter
events before they are passed to other kinds of tools. Examples are
zoom or highlighting.
Interactive tools are implemented as (hierarchical) state machines.
An interactive tool can call another interactive or batch tool (for
example, drag tool internally calls selection tool to know what to
Each tool has a predefined activation event, and accepts a
predefined range of keyboard/mouse events, assigned when the tool
instance is created. Tools can exit when they want or when
application-wide exit event is received (i.e. pressing Esc).
In general, tools are not allowed to draw anything that doesn't go
through the View, unless there exists a very good reason for doing
so (an example is drawing transparent selection boxes or moving
large groups of items)
One tool = one class. Tools must not use non-trivial static methods
and must never, ever, have any global states. Main tool interface
must not have any wx dependencies. If the tool needs special GUI
other than a menu entry, shortcut and button in a toolbar or the
right-click menu (e.g. a settings dialog/docker), it must be handled
by a separate, non-public class.
Tools are registered within a application-wide tool manager via a
factory class/function. This allows for adding tools as DLL/DSO
Tools use Kicad-internal event format, that works with native board
units and follows gestures & shortcuts set in application
preferences. A big advantage of this approach is the ability to
drive a tool with a series of events from a script. For instance, an
automatic BGA fanouter script could simply run the P&S tool with a
click-move-click series of events for each pad instead of
calculating every breakout trace itself.
Work to do:
come up with a specification
make the initial version, that works in parallel with the legacy
port the P&S router to the new framework
testing & review release
refactor remaining of editing tools (one by one).
5. Page templates & script-driven text evaluation.
Currently, the page frame is hardcoded. There is no possibility of
changing its contents other than conditional compilation (i.e.
add option of saving graphical objects (no wiring/traces) into a
template schematic/PCB file and attaching such file
to a schematic/PCB.
mark items that belong to the template as non-editable (they can't
be selected or otherwise altered).
add spreadsheet-style expressions for texts (i.e. placing a text
'=GetBoard().GetCreationDate()' will be rendered as the date
remove hardcoded page templates. Say goodbye to GOST flag.
6. Further modularization & decoupling
Type*: improvement Depends on*: page templates, scripting, View/Tool frameworks. Goal*: Cleaner code. Kicad applications as DLLs/DSOs. Status*: planning Specific release*: Kicad with lightweight core and optional
functionality done in plugins. Applications hosted as tabs in a common
* remove unnecessary build flags. The main reason is to limit the
number of possible build configurations, which is often abused by Linux
users/package maintainers to produce incompatible software packages.
Features that are truly optional, should never be handled by #ifdefs,
but turned into DLL/DSO plugins or Python scripts. Such flags are:
- KICAD_KEEPCASE: we should be either case-sensitive or not.
- KICAD_SCRIPTING: basic feature that must not be disabled once fully
integrated and tested: DRC classes will become scriptable, filter tool
will require Python expressions.
- KICAD_SCRIPTING_WXPYTHON: with the tool framework in place,
wxPython console could become another DLL/DSO tool.
- USE_WX_GRAPHICS_CONTEXT: will be replaced by the GAL/VIEW.
- USE_WX_OVERLAY: same as above
- USE_PCBNEW_NANOMETERS: P&S relies on the new BIU format. There is
no reason to keep the old one.
- USE_FP_LIB_TABLE: once done, it should become a standard
- wxUSE_UNICODE: does it make any sense to allow user to select this?
factorize all plugins into DLL/DSO libraries.
factorize plotting code away from the model code, move plotting code
factorize 3D viewer code away from the model code (PAINTER-like
equivalent for 3D or a 3D VIEW component)
move 3D model loading into plugins. Develop a global 3D model cache.
clean up program-specific #ifdefs (#ifdef EESCHEMA, #ifdef
PCBNEW, etc.) in common code.
modify the UI code to host pcbnew/eeschema/gerbv as tabs inside the
compile eeschema, gerbview & pcbnew into DLLs/DSOs. If
globals/statics cleanup is done correctly, several instances of
these apps should run in parallel inside a common shell.
7. Integrated library browser
Type*: feature Depends on*: apps as DLL/DSOs (point 6), View, FP_LIB_TABLE. Goal*: Selection of footprints / 3D models directly on schematic. Status*: planning Specific release*: eeschema with footprint assignment on schematic.
develop a library browser: dockable window that allows selecting a
component and assigning its footprint/3D model
directly on the schematic (see attached drawing)
add a possibility to define the list of default footprints for each
component in an SCH library.
modify eeschema to use the new browser & library editor to
7. Improve UI.
Type*: improvement Depends on*: wx 3.0 (for AUI), tool framework. Goal*: Clean up UI and improve its usability. Status*: planning Specific release*: All kicad apps with new UI.
Study ergonomics of various commercial/proprietary PCB applications
Clean up menu structure. Menus must allow access to all features of
the program in a clear and logical way. currently some functions of
pcbnew are accessible only through toolbars.
Use new wxWidgets and wxAUI for toolbars, enable detaching and
disabling. This will probably need standardizing all builds
(Windows, Linux, OSX) to use the same version of wxWidgets. At this
point, wx 3.0 will be (hopefully) available.
Redesign dialogs, make sure they are following same style rules.
Check quality of translations. Either fix or remove bad quality
Develop global shortcut manager that lets the user assign arbitrary
shortcuts for any tool/action.
8. Improved DRC
Type*: feature Depends on*: geometry library. Goal*: Additional DRC checks. Status*: planning Specific release*: pcbnew with production quality DRC engine, ported
to the new Geometry library
replace all existing geometry code with the new geometry library.
ensure there is no floating point in any clearance-related
Currently Kicad does not track atomic changes between subsequent updates
between SCH & PCB. We need a concept of an ECO (engineering change of
order) that describes a list of atomic changes between two netlists.
This will allow robust forward/backannotation between pcbnew and
eeschema and enable features like pin/part/bus/differential pair
For instance, if the user modifies the value, footprint and swaps the
pins of an electrolytic capacitor, the ECO shall
contain 6 following atomic entries:
When updating the PCB/SCH, the list of changes is presented to the user
and he is given a choice which ones get committed,
just like in a revision control system. The same mechanism can be used
to diff netlists between different versions of schematics/PCB designs.
develop netlist comparison engine (a class that takes two textual
netlists and produces the ECO)
integrate into eeschema/PCBnew. Add "Update PCB/SCH" option that
will launch comparison/annotation process.
develop pin swapping configuration dialog: for each of the
components on the schematic, pins/subparts can be assigned to a swap
group. Group information gets propagated to pcbnew via extra fields
in the netlist.
develop pin/part swapper pcbnew tool, that highlights and numbers
all swappable pins/parts (indicating swap groups using colors or
labels), and upon clicking on a pair of pins that belong to same
group, swaps their nets. Swapped net info is passed back to eeschema
via the ECO mechanism.
support net label backannotation in the eeschema: for nets that have
changed pins, net labels on wire stubs connected to pins are
(optional) graphical visualization of netlist changes.
10. Intelligent selection tool.
Type*: feature Depends on*: tool framework, geometry library. Goal*: ability to select (just select) any objects on a
schematic/PCB. Status*: planning Specific release*: pcbnew and eeschema with object selection and
The first stage involves development of a neighbourhood-aware select
tool. When the user clicks on a bunch of items that overlap, the tool
should try to guess what item he meant. Few use cases are:
if the user clicks on a trace that goes under a component, the trace
should be selected by default (without a clarification menu) if the
component could be selected unambiguously just by clicking few
if there are two overlapping traces on different layers,
disambiguation menu should be triggered only if the traces are that
is mutually covered is larger than certain threshold.
component text could be selectable when the host component is
disambiguation menu could be extended to draw a miniature of each
The second stage adds drag & drop support for both eeschema & pcbnew **
11. Introspection & properties, inspector tool
Type*: feature Depends on*: none. Goal*: inspector tool. Status*: planning Specific release*: pcbnew & eeschema with inspector tool. Cleaner
Develop or adapt an introspection/property system for Kicad classes.
This will allow for:
much easier development of dialogs (less C** coding). For
advanced/rarely used settings,
a generic name-type-value table is enough.
automatic serialization of settings classes to config/project files.
inspector tool - a name-type-value table containing all common
properties of currently selected objects. Changing one
property modifies it in all selected objects.
12. Virtual components & net properties in eeschema.
Type*: feature Depends on*: none. Status*: planning Specific release*: eeschema with user-defined net properties.
add a graphical net property object in eeschema. Such object holds
extra properties, such as SI parameters (diff/single ended,
impedance) or clearance information that is compiled into the PCB
add an option to declare certain components 'virtual'. Such
components are not exported to PCB netlist, but can be used for
simulations (i.e. U/I probes, votage sources, etc.)
13. Integrated simulator support
Type*: feature Depends on*: virtual components, tool framework. Goal*: circuit simulation as easy as in LTSpice. Status*: planning Specific release*: eeschema with integrated simulator backend.
do a survey of available simulators (candidates: spice, gnucap,
find a nice plotting library that plays well with wxWidgets
add support for exporting netlists in the format supported by the
handle simulator output in a consistent way through our plotting
library (in LTSpice, it is done remarkably well!)
develop a 'fine tune' tool that allows modification of component
values on-the-fly. Each value gets a scrollbar/knob. Adjusting the
knob re-runs the simulation and updates the plots. May require
hacking the simulator code.
put all of above in a plugin. There can be multiple plugins,
supporting different simulators.
define a library of simulation-only components (sources, ideal RCL,
voltage/current probes, etc).
14. Differential pair/bus routing support.
Type*: feature Depends on*: virtual components, tool framework, P&S, net
properties, improved DRC, geometry library. Goal*: full differential pair support. Status*: planning Specific release*: eeschema & pcbnew with diff pair routing
Modify P&S to support multi-track routing
Extend layers settings dialog in pcbnew to input basic SI
parameters: permittivity, losse factor, thickness and reference
planes for each copper/core/prepreg layer.
Integrate PCB calculator code into PCBnew/eeschema allowing for
direct control of trace impedance. Impedance for the lines could be
defined as a net property/attribute.
Add necessary rules and DRC checks: differential pair impedance
match, max uncoupled distance, min/max gap (per-layer), intra-pair
skew, corner angles.
Add differential pair markers in eeschema (can be done as a virtual
component that is connected to a net).