The reason was a synchronization issue.
Actually "LayerPropertiesNodeRef" is not a reference, but
a mirror copy of the LayerPropertiesNode the reference points
to. Changes to the original must be synchronized into the
reference and back.
This concept is a tribute to the original implementation and
the node reference was a convenience add-on to the iterator-
based API.
Better solution in general is to replace the LayerPropertiesNodeRef
concept with a real reference.
1.) Copy & Cut will now take the selection from
the transient selection if no real selection is present
2.) Hence, Copy & Cut are always enabled
3.) The same if true for duplicate
4.) Move interactive will also act immediately on the transient
selection.
- The MAG reader now has access to the details of the proposed
technology (set in KLayout), specifically inside library paths
($(tech_name), $(tech_dir)). This allows setting the MAG reader
path relative to the technology path.
- If no specific technology is set before MAG files are read and
the technology listed there is found in KLayout, KLayout will
attach the layout to this technology.
- force lower-case layer names to allow CIF/MAG loop (CIF needs
upper-case layer names, MAG doesn't)
- reverted CIF reader to standard
- new options for writer: tech, "zero timestamp".
- file name MUST be consistent with one cell name.
Reason: it's not possible to derive the initial
cell from the given options, so without the file name
being consistent, we can't know what to write there.
Basically the file name rather supplies the path.
The tech group is a new XML tag "<group>...</group>".
This tag is editable in the tech "general" page as "Group".
If non-empty, a submenu will be created in the tech selector
menu for all techs with the same group.
- "follow selection": allows navigating between the bookmarks
with the cursor keys
- "manage bookmarks" now starts with the selected bookmarks
also selected.
Here is the proposal:
- There is a new panel similar to the layer list showing the
bookmarks. It can be shown using View/Bookmarks.
Initially this panel is hidden.
- Double-clicking on an item in this bookmark list will
navigate to the bookmark.
- Context menu entries of this panel are: manage, load and
save bookmarks (like in main menu)
In addition, "bookmark this view" now proposes a bookmark name
make of "B" and a unique number.
Three mode menu items appear in "Targets for Key Binding"
in the setup dialog and can be bound to a key.
"Move Interactive" will immediately start moving the
selection.
"Paste Interactive" and "Duplicate Interactive" will
paste and then immediately start moving.
Remaining issue: when Paste or Duplicate moves are
cancelled the pasted objects will still be there and
at the original location. So they are may be hard to
see. Also with Undo, two undo items are there: Paste
and Move.
The solution tries to be a bit more generic:
- four buttons are there to synchronize coordinates
- three buttons to snap p1, p2 and auto-measure from p1.
Rerun LVS: a button is provided which allows re-running
the LVS or netlist extraction from the netlist browser.
TODO: a generic concept for triggering the generators
"Partial LVS" is a feature where it's possible to
select a layout subcell - running LVS then will only
compare against the corresponding schematic subcell, not
the whole tree. The magic is done by "align" which will
remove the upper hierarchy part.
When a "create instance" operation with a library cell
was undone the following issue could be seen: as the library
cell might create new layers in the target layout, these
needed to be undone when the operation was reverted.
But then the canvas bit planes got messed up because the
"LayoutView::set_view_ops" call was missing. Now this
happens inside the manipulation functions for deleting
and inserting layers. This should also reduce the
necessity to call LayoutView::update_content explicitly.
New convenience functions are provided which simplify
manipulation of key bindings and menu item visibility
configuration strings. AbstractMenu#pack_key_binding
and AbstractMenu#unpack_key_binding turn a path/key
map into a single string and back. The string format
is the same than for the key-binding configuration key.
The same is provided for the menu item visibilily
with AbstractMenu#pack_menu_item_visible and
Abstract#unpack_menu_item_visible.
For a backward compatible solution, a key binding
target of '' still means "take default". For
"nothing", a new pseudo-key "none" was defined.
For scripting, this value is available as
constant "Action#NoShortCut".
This is a small paradigm shift in the configuration hierarchy:
plugins (as children of root) now inherit the configuration
from the parent - now only through configure, but also through
config_get (pull with config_get vs. push with configure).
TODO: both methods are not entirely consistent as configure
can block propagation of configuration settings. But that's a
feature hardly used anyway and rather an optimization thing.
Bugfixes:
1.) A crash due to wrong key_event_handler pointer
(relevant for hierarchy view)
2.) When switching cellview the focus wasn't changed
and selection stayed in old cellview
Devices: try to pair unmatching ones similar to subcircuits
Don't sort devices by the device name but by class name
Show the device parameters for netlist devices (same as
for netlist browser)
General topic: abstracts and swappable pins.
Issue: we work bottom up and assign pins. This is the
basis for net graph building. But swappable means those
pins can change. The compare works fine, but debugging
output is strange: as the pin assigned is fixed, the nets
found to be attached to a circuit might not fit any
proposed pin pair (which does not contain swapping).
The problem gets worse with abstracts.
The enhancements are
- Such cases generate only warnings in the browser
and the message says swapping might be the case
- Floating nets are treated differently. This should
lead to a better performance for abstracts/black boxes,
but in case of disconnected pins (due to wire errors),
floating nets happen to create mismatches in the nets above.
- Net graph building does not consider swappable nets. In
case of two swappable pins this wouldn't be an issue, but
for more than two this would create ambiguities and
prevent topological matching.
Plus: Debug output option for net graph
Tests updated
- For unattached subcircuit pins no error should be reported
- For abstract nets, graph propagation through subcircuit pins isn't attempted.
Abstract nets are only dummy-associated currently.
Previous: empty layers occupied a special layer in the DSS
But what when empty layers are required as outputs?
ONE layer isn't good -> would overwrite the layer and it's
no longer empty for others.
So we need to keep the layers separate.
In addition, this fix includes Python-related fixes: because
of the short lifetime of Python references, the functionality
was not as expected sometimes. Keeping copies of LayerPropertiesIterators
helped. Some tweaks were required to maintain the delete() semantics.
- some refactoring
- better performance (was slow because layer iteration
was done outside of loop and recursive cluster iterator)
- with selected nets, only the required hierarchy is
produced. For this a new argument is added to
LayoutToNetlist::create_cell_mapping (nets) which
allows selecting the nets for which a cell mapping
is requested
- Two new device extractors for resistors and caps
(two-terminal only)
- R and C device classes have A and P parameters now
- A generic concept to supply terminal output layers
for device extractors (tX).
- Converted offset to transformation for devices:
this was required to make circuit flattening preserve
the geometry (transformation of devices)
L2N/LVSDB formats have been extended for this.
- Reverted sorting of circuits top-down because the solution
was inconsistent -> needs to be solved by proxy
- Provide a sample transformation for subcircuits without connections
(potential for refactoring!)
- better performance when changing layer properties (by deferred
execution of the callback)
- coloring of nets (net color has precedence)
- sorting of circuits top-down