This page hosts a proposal for various work packages which are meant to
bring KiCad on par with proprietary software
regarding features that are required for designing boards of similar
complexity to our SPEC and
SVEC projects. We are actively
working on these packages. Our developments happen completely within the
frame of the official KiCad project, in complete synchronism with the
rest of the KiCad development community. If you would like to help us
move faster through the list, please consider
so we can use additional external help.
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*: in progress 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, view, tool Status*: available in the official KiCad product
branch Specific release*: pcbnew with P&S route tool
Routing single tracks with clearances as specified in the design
Shoving already existing tracks.
Routing engine performs intermediate calculations on its internal
model and updates the main (BOARD) model whenever a 'stable' routing
Via shoving support.
Routing engine might run in a separate thread, to make it more
Type*: framework/library Depends on*: editable version depends on the tool framework Goal*: robust display layer for all KiCad applications, based on the
GAL. Refactoring towards clean MVC model. First client*: tool framework Status*: available in the official KiCad product
branch 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.
Allow users to select own layer color scheme, layer transparency,
drawing order, contrast and wireframe/solid rendering mode.
Enable antialiasing in the OpenGL view. Make it an option for both
Given the experience gained with pcbnew, redo gerbview and
schematics in the same manner.
Add support for bitmap fonts for items that are not stored in gerber
files (e.g. track and pads labels), to gain even more performance
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*: improvement Depends on*: none Goal*: More mechanical layers. Way for future extensions (split
planes). Status*: available in the official KiCad product
branch Specific release*: pcbnew with extra mechanical/dimensioning layers.
32 copper layers available
new mechanical layers: Margin, Courtyard, Fabrication
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 and new Selection tool. Status*: available in the official KiCad product
branch Specific release*: pcbnew with fully functional P&S.
Type*: feature Depends on*: Python scripting. Goal*: Removing KICAD_GOST build option. Status*: available in the official KiCad product
branch Specific release*: KiCad (all apps) with user-definable page
The page frame was hardcoded, so there was no possibility of changing
its contents other than conditional compilation (i.e. KICAD_GOST flag).
Saving graphical objects (no wiring/traces) into a template
schematic/PCB file and attaching such file to a schematic/PCB.
Items that belong to the template are non-editable (they can't be
selected or otherwise altered).
Removed hardcoded page templates.
Add spreadsheet-style expressions for texts (i.e. placing a text
'=GetBoard().GetCreationDate()' will be rendered as the date
7. 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
Clean up program-specific #ifdefs (#ifdef EESCHEMA, #ifdef
PCBNEW, etc.) in common code.
* Globals/statics cleanup, so several instances of these apps should
run in parallel inside a common shell.
* 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 (currently
it is ON by default, I guess it could be removed soon without any
- 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
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.
Modify the UI code to host pcbnew/eeschema/gerbv as tabs inside the
Type*: improvement Depends on*: View/Tool frameworks Goal*: Ease and speed up the process of footprint creation. Status*: available in the official KiCad product
branch Specific release*: KiCad with GAL-based module editor.
Module viewer and editor use the Graphics Abstraction Layer to
Type*: feature Depends on*: apps as DLL/DSOs (previous point), View,
FP_LIB_TABLE. Goal*: Selection of footprints / 3D models directly on schematic. Status*: in progress Specific release*: eeschema with footprint assignment on schematic.
Allow selecting a component and assigning its footprint directly on
Add a possibility to define the list of default footprints for each
component in an SCH library.
Consider ditching cvpcb (currently it is an optional step, if
someone prefers assigning all footprints using a single window).
Make the library browser a dockable window.
Add an option to assign 3D models from eeschema.
10. Improve UI
Type*: improvement Depends on*: wxWidgets 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.
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.
Type*: feature Depends on*: DLL/DSO KiCad apps Goal*: Pin/part swapping. Netlist diff tool. Status*: in progress, experimental
branch Specific release*: pcbnew with pin/part swapper.
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.
Done (in the experimental branch):
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 (available in eeschema in
the experimental branch)
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.
Type*: feature Depends on*: tool framework, geometry library Goal*: ability to select (just select) any objects on a
schematic/PCB. Status*: available in the official KiCad product
branch Specific release*: pcbnew and eeschema with object selection and
It is possible to select single items by clicking them or select
multiple items at the same time by drawing a selection box.
In case of disambiguation while selecting a single item, there is a
context menu shown, that allows to decide which of items should be
Items presented in the disambiguation menu are marked in a specific
way as user highlights a menu entry.
Additive selection is possible by holding Shift key while selecting
items (then the selection is being extended rather than discarding
previous items and replacing them with the current choice).
Selected items can be modified by the move tool. The tool can be
invoked using hot keys ('M' to start moving selected items, 'F' for
flipping and 'R' for rotation while they are in the move), context
menu (right mouse button click on selection to display one) or by
simply dragging selected items with mouse.
There is a simple undo operation available, that rollbacks the
current modifications before they are applied. To reverse the last
operation, simply press ESC while dragging items.
The selection tool takes into account current display settings. That
means that it does not select invisible items or those which are
grayed out in the high contrast mode. It also does not allow to
select lines that belong to modules and are displayed on silkscreen
layer, in order not to break module drawings.
In cases when there can be a whole module or a single track
selected, the tool chooses the smaller object. Whole module can be
selected by clicking on a space that does not contain any other
objects or by using a selection box.
Zones can be selected either by clicking on any of their edges or by
drawing a selection box that contains the whole zone.
If there are two overlapping tracks on different layers,
disambiguation menu should be triggered only if the tracks are that
is mutually covered is larger than certain threshold.
14. 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
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.
15. Virtual components & net attributes in eeschema
Type*: feature Depends on*: new eeschema file format. Status*: planning Specific release*: eeschema with user-defined net attributes.
add a graphical net property (attribute) object in eeschema. Such
objects hold additional attributes, such as SI parameters
(diff/single ended, impedance) or clearance information that is
compiled into the PCB netlist.
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.)
16. Integrated simulator support
Type*: feature Depends on*: virtual components, tool framework. Goal*: circuit simulation as easy as in LTSpice. Status*:
in the product branch Specific release*: eeschema with integrated simulator backend.
do a survey of available simulators (candidates: ngspice, 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).
17. 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*: in progress Specific release*: eeschema & pcbnew with diff pair routing
Modify P&S to support multi-track routing
Differential pair routing
Trace length matching
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 track 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).