diff --git a/Changelog b/Changelog index 95dc314f7f..d015c3bfbc 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,50 @@ +0.28.11 (2023-08-09): +* Bugfix: %GITHUB%/issues/1307 (partial) LEF/DEF PIN labels are taken from NET, not PIN name +* Bugfix: %GITHUB%/issues/1415 GDS2 files with meta info are not read by old versions of KLayout +* Bugfix: %GITHUB%/issues/1422 DXF file parsing error, about spline curve +* Bugfix: %GITHUB%/issues/1425 Python Binding / Layout / find_layer broken for layer "name" +* Bugfix: %GITHUB%/issues/1428 Feature request: "%include" in macros should allow including XML files too +* Bugfix: %GITHUB%/issues/1430 Add option to filter out geometric primitives from Marker Database Browser Info widget +* Bugfix: %GITHUB%/issues/1432 strm2oas def ignores path segment after + VIRTUAL + RECT +* Bugfix: %GITHUB%/issues/1433 Fix def syntax error in testdata/lefdef/viasize2/test.def +* Bugfix: %GITHUB%/issues/1453 Zoom (in) function with selected layers significantly slower in newer releases +* Enhancement: %GITHUB%/issues/1438 Provide a configuration option to switch back to old-style text selection (at origin only) +* Enhancement: %GITHUB%/issues/1440 Relative margin for Marker Database Browser +* Enhancement: %GITHUB%/issues/1441 Support for label position in Marker Database Browser +* Enhancements: + - Add a default extension to file names unless one is given + - Selection on partial mode enhanced: allow selection of edge + ends if edges overlap, graphical indicator for selected partial + - Wheel events do no longer change Combo Box selections + - DRC/LVS: log output overhead reduced for faster execution in + small layout cases + - Added RBA::Image/pya.Image constructor taking QImage and PixelBuffer + - Point objects are native citizens now of the database and act as + representatives for handles, better editing and visualization of + the latter + - Macro editor has "find previous" button now + - Mitigate the effect of overriding a globally-defined technology + with -nn on the command line by creating tech variants + - LEF/DEF map files now allow LEFPINNAME and PINNAME purpose to + map pin labels in a more consistent way +* Bugfix: + - Tilde expansion wasn't working for layout write + - Python specific API documentation did not mention disambiguation + for property/method ambiguity + - Python error messages are more readable and contain the exception + class + - PCell layer-type parameters did not work without a default value + - Point-like PCell handles now cannot be spoiled any longer in partial + mode + - "Duplicate" was also duplicating cells or layers depending on the + scope which was irritating. Now it's confined to geometry + - DRC/LVS logs list the correct line also with include files + - "report" wasn't working in DRC/LVS scripts for scripts only using + external sources + - Fixed a potential segfault on application exit + - Enhancements to the macro editor's search & replace function - + "replace and search next" wasn't working properly and other flaws + 0.28.10 (2023-07-05): * Bugfix: %GITHUB%/issues/1397 LayoutMetaInfo serialization/deserialization problem * Bugfix: %GITHUB%/issues/1404 Better support for editing mode in Qt-less LayoutView diff --git a/src/laybasic/laybasic/layFinder.cc b/src/laybasic/laybasic/layFinder.cc index 0b756967fa..be581c5d8d 100644 --- a/src/laybasic/laybasic/layFinder.cc +++ b/src/laybasic/laybasic/layFinder.cc @@ -475,6 +475,8 @@ ShapeFinder::checkpoint () void ShapeFinder::visit_cell (const db::Cell &cell, const db::Box &hit_box, const db::Box &scan_box, const db::DCplxTrans &vp, const db::ICplxTrans &t, int /*level*/) { + checkpoint (); + if (! m_context_layers.empty ()) { std::map::const_iterator ctx = m_cells_with_context.find (cell.cell_index ()); @@ -499,12 +501,12 @@ ShapeFinder::visit_cell (const db::Cell &cell, const db::Box &hit_box, const db: if (! point_mode ()) { - checkpoint (); - for (std::vector::const_iterator l = layers ().begin (); l != layers ().end (); ++l) { if (layers ().size () == 1 || (layers ().size () > 1 && cell.bbox ((unsigned int) *l).touches (scan_box))) { + checkpoint (); + const db::Shapes &shapes = cell.shapes ((unsigned int) *l); db::ShapeIterator shape = shapes.begin_touching (scan_box, m_flags, mp_prop_sel, m_inv_prop_sel); @@ -560,6 +562,8 @@ ShapeFinder::visit_cell (const db::Cell &cell, const db::Box &hit_box, const db: db::ShapeIterator shape = shapes.begin_touching (scan_box, m_flags, mp_prop_sel, m_inv_prop_sel); while (! shape.at_end ()) { + checkpoint (); + bool match = false; double d = std::numeric_limits::max (); diff --git a/src/layui/layui/layWidgets.cc b/src/layui/layui/layWidgets.cc index ae98518433..2a92724122 100644 --- a/src/layui/layui/layWidgets.cc +++ b/src/layui/layui/layWidgets.cc @@ -1090,7 +1090,7 @@ MarginWidget::MarginWidget (QWidget *parent, const char *name) setFrameStyle (QFrame::NoFrame); QHBoxLayout *layout = new QHBoxLayout (this); - layout->setMargin (0); + layout->setContentsMargins (0, 0, 0, 0); QLineEdit *le = new QLineEdit (this); mp_abs_edit = le; @@ -1299,6 +1299,8 @@ void DecoratedLineEdit::mouseReleaseEvent (QMouseEvent *event) } } + + QLineEdit::mouseReleaseEvent (event); } void DecoratedLineEdit::mousePressEvent (QMouseEvent *event) @@ -1317,9 +1319,11 @@ void DecoratedLineEdit::mousePressEvent (QMouseEvent *event) } } + + QLineEdit::mousePressEvent (event); } -void DecoratedLineEdit::resizeEvent (QResizeEvent * /*event*/) +void DecoratedLineEdit::resizeEvent (QResizeEvent *event) { int fw = hasFrame () ? le_frame_width : 0; @@ -1334,6 +1338,8 @@ void DecoratedLineEdit::resizeEvent (QResizeEvent * /*event*/) QRect r = geometry (); mp_options_label->setGeometry (fw, 0, label_size.width (), r.height ()); } + + QLineEdit::resizeEvent (event); } // ------------------------------------------------------------- diff --git a/src/pymod/distutils_src/klayout/dbcore.pyi b/src/pymod/distutils_src/klayout/dbcore.pyi index 7bd4429f08..ab8f3869ea 100644 --- a/src/pymod/distutils_src/klayout/dbcore.pyi +++ b/src/pymod/distutils_src/klayout/dbcore.pyi @@ -1042,7 +1042,7 @@ class Cell: If necessary, this method creates a new variant and replaces the given instance by an instance of this variant. - The parameters are given in the order the parameters are declared. Use \pcell_declaration on the instance to get the PCell declaration object of the cell. That PCellDeclaration object delivers the parameter declaration with it's 'get_parameters' method. + The parameters are given in the order the parameters are declared. Use \pcell_declaration on the instance to get the PCell declaration object of the cell. That PCellDeclaration object delivers the parameter declaration with its 'get_parameters' method. Each parameter in the variant list passed to the second list of values corresponds to one parameter declaration. There is a more convenient method (\change_pcell_parameter) that changes a single parameter by name. @@ -2318,7 +2318,7 @@ class Cell: @brief Transforms the instance into a new coordinate system with the given transformation @return A reference (an \Instance object) to the new instance - In contrast to the \transform method, this method allows propagation of the transformation into child cells. More precisely: it applies just a part of the given transformation to the instance, such that when transforming the cell instantiated and it's shapes with the same transformation, the result will reflect the desired transformation. Mathematically spoken, the transformation of the instance (A) is transformed with the given transformation T using "A' = T * A * Tinv" where Tinv is the inverse of T. In effect, the transformation T commutes with the new instance transformation A' and can be applied to child cells as well. This method is therefore useful to transform a hierarchy of cells. + In contrast to the \transform method, this method allows propagation of the transformation into child cells. More precisely: it applies just a part of the given transformation to the instance, such that when transforming the cell instantiated and its shapes with the same transformation, the result will reflect the desired transformation. Mathematically spoken, the transformation of the instance (A) is transformed with the given transformation T using "A' = T * A * Tinv" where Tinv is the inverse of T. In effect, the transformation T commutes with the new instance transformation A' and can be applied to child cells as well. This method is therefore useful to transform a hierarchy of cells. This method has been introduced in version 0.23. The original instance may be deleted and re-inserted by this method. Therefore, a new reference is returned. @@ -2361,7 +2361,7 @@ class Cell: def write(self, file_name: str) -> None: r""" @brief Writes the cell to a layout file - The format of the file will be determined from the file name. Only the cell and it's subtree below will be saved. + The format of the file will be determined from the file name. Only the cell and its subtree below will be saved. This method has been introduced in version 0.23. """ @@ -2369,7 +2369,7 @@ class Cell: def write(self, file_name: str, options: SaveLayoutOptions) -> None: r""" @brief Writes the cell to a layout file - The format of the file will be determined from the file name. Only the cell and it's subtree below will be saved. + The format of the file will be determined from the file name. Only the cell and its subtree below will be saved. In contrast to the other 'write' method, this version allows one to specify save options, i.e. scaling etc. This method has been introduced in version 0.23. @@ -3053,7 +3053,7 @@ class CellMapping: r""" @brief A constant indicating the request to drop a cell - If used as a pseudo-target for the cell mapping, this index indicates that the cell shall be dropped rather than created on the target side or skipped by flattening. Instead, all shapes of this cell are discarded and it's children are not translated unless explicitly requested or if required are children for other cells. + If used as a pseudo-target for the cell mapping, this index indicates that the cell shall be dropped rather than created on the target side or skipped by flattening. Instead, all shapes of this cell are discarded and its children are not translated unless explicitly requested or if required are children for other cells. This constant has been introduced in version 0.25. """ @@ -3684,7 +3684,7 @@ class Circuit(NetlistObject): def flatten_subcircuit(self, subcircuit: SubCircuit) -> None: r""" @brief Flattens a subcircuit - This method will substitute the given subcircuit by it's contents. The subcircuit is removed after this. + This method will substitute the given subcircuit by its contents. The subcircuit is removed after this. """ def has_refs(self) -> bool: r""" @@ -3926,12 +3926,12 @@ class CompoundRegionOperationNode: @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer value + @brief Compares two enums """ @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares two enums + @brief Compares an enum with an integer value """ @overload def __init__(self, i: int) -> None: @@ -4012,12 +4012,12 @@ class CompoundRegionOperationNode: @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer value + @brief Compares two enums """ @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares two enums + @brief Compares an enum with an integer value """ @overload def __init__(self, i: int) -> None: @@ -4200,12 +4200,12 @@ class CompoundRegionOperationNode: @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer value + @brief Compares two enums """ @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares two enums + @brief Compares an enum with an integer value """ @overload def __init__(self, i: int) -> None: @@ -4290,12 +4290,12 @@ class CompoundRegionOperationNode: @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares two enums + @brief Compares an enum with an integer value """ @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer value + @brief Compares two enums """ @overload def __init__(self, i: int) -> None: @@ -4320,12 +4320,12 @@ class CompoundRegionOperationNode: @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer for inequality + @brief Compares two enums for inequality """ @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares two enums for inequality + @brief Compares an enum with an integer for inequality """ def __repr__(self) -> str: r""" @@ -4452,7 +4452,7 @@ class CompoundRegionOperationNode: @classmethod def new_edges(cls, input: CompoundRegionOperationNode) -> CompoundRegionOperationNode: r""" - @brief Creates a node converting polygons into it's edges. + @brief Creates a node converting polygons into its edges. """ @classmethod def new_empty(cls, type: CompoundRegionOperationNode.ResultType) -> CompoundRegionOperationNode: @@ -5668,7 +5668,7 @@ class CplxTrans: r""" @brief Inverts the transformation (in place) - Inverts the transformation and replaces this transformation by it's + Inverts the transformation and replaces this transformation by its inverted one. @return The inverted transformation @@ -7825,7 +7825,7 @@ class DCplxTrans: r""" @brief Inverts the transformation (in place) - Inverts the transformation and replaces this transformation by it's + Inverts the transformation and replaces this transformation by its inverted one. @return The inverted transformation @@ -10293,7 +10293,7 @@ class DPolygon: r""" @brief Returns true, if the polygon is a simple box. - A polygon is a box if it is identical to it's bounding box. + A polygon is a box if it is identical to its bounding box. @return True if the polygon is a box. @@ -10962,7 +10962,7 @@ class DSimplePolygon: r""" @brief Returns a value indicating whether the polygon is a simple box. - A polygon is a box if it is identical to it's bounding box. + A polygon is a box if it is identical to its bounding box. @return True if the polygon is a box. @@ -11308,8 +11308,7 @@ class DText: Setter: @brief Sets the vertical alignment - This property specifies how the text is aligned relative to the anchor point. - This property has been introduced in version 0.22 and extended to enums in 0.28. + This is the version accepting integer values. It's provided for backward compatibility. """ x: float r""" @@ -21157,7 +21156,7 @@ class GenericDeviceExtractor(DeviceExtractorBase): r""" @brief Defines a layer with a fallback layer. @return The layer descriptor object created for this layer (use 'index' to get the layer's index) - As \define_layer, this method allows specification of device extraction layer. In addition to \define_layout, it features a fallback layer. If in the device extraction statement, the primary layer is not given, the fallback layer will be used. Hence, this layer is optional. The fallback layer is given by it's index and must be defined before the layer using the fallback layer is defined. For the index, 0 is the first layer defined, 1 the second and so forth. + As \define_layer, this method allows specification of device extraction layer. In addition to \define_layout, it features a fallback layer. If in the device extraction statement, the primary layer is not given, the fallback layer will be used. Hence, this layer is optional. The fallback layer is given by its index and must be defined before the layer using the fallback layer is defined. For the index, 0 is the first layer defined, 1 the second and so forth. """ @overload def define_terminal(self, device: Device, terminal_id: int, layer_index: int, point: Point) -> None: @@ -21321,7 +21320,7 @@ class GenericDeviceParameterCompare(EqualDeviceParameters): class GenericNetlistCompareLogger(NetlistCompareLogger): r""" @brief An event receiver for the netlist compare feature. - The \NetlistComparer class will send compare events to a logger derived from this class. Use this class to implement your own logger class. You can override on of it's methods to receive certain kind of events. + The \NetlistComparer class will send compare events to a logger derived from this class. Use this class to implement your own logger class. You can override on of its methods to receive certain kind of events. This class has been introduced in version 0.26. """ class Severity: @@ -21529,12 +21528,12 @@ class HAlign: @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer for inequality + @brief Compares two enums for inequality """ @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares two enums for inequality + @brief Compares an enum with an integer for inequality """ def __repr__(self) -> str: r""" @@ -22362,7 +22361,7 @@ class ICplxTrans: r""" @brief Inverts the transformation (in place) - Inverts the transformation and replaces this transformation by it's + Inverts the transformation and replaces this transformation by its inverted one. @return The inverted transformation @@ -23551,11 +23550,11 @@ class Instance: Starting with version 0.25 the displacement is of vector type. Setter: - @brief Sets the displacement vector for the 'a' axis + @brief Sets the displacement vector for the 'a' axis in micrometer units - If the instance was not an array instance before it is made one. + Like \a= with an integer displacement, this method will set the displacement vector but it accepts a vector in micrometer units that is of \DVector type. The vector will be translated to database units internally. - This method has been introduced in version 0.23. Starting with version 0.25 the displacement is of vector type. + This method has been introduced in version 0.25. """ b: Vector r""" @@ -23860,14 +23859,14 @@ class Instance: r""" @brief Gets the bounding box of the instance for a given layer @param layer_index The index of the layer the bounding box will be computed for. - The bounding box incorporates all instances that the array represents. It gives the overall extension of the child cell as seen in the calling cell (or all array members if the instance forms an array) for the given layer. If the layer is empty in this cell and all it's children', an empty bounding box will be returned. + The bounding box incorporates all instances that the array represents. It gives the overall extension of the child cell as seen in the calling cell (or all array members if the instance forms an array) for the given layer. If the layer is empty in this cell and all its children', an empty bounding box will be returned. This method has been introduced in version 0.25. 'bbox' is the preferred synonym for it since version 0.28. """ def bbox_per_layer(self, layer_index: int) -> Box: r""" @brief Gets the bounding box of the instance for a given layer @param layer_index The index of the layer the bounding box will be computed for. - The bounding box incorporates all instances that the array represents. It gives the overall extension of the child cell as seen in the calling cell (or all array members if the instance forms an array) for the given layer. If the layer is empty in this cell and all it's children', an empty bounding box will be returned. + The bounding box incorporates all instances that the array represents. It gives the overall extension of the child cell as seen in the calling cell (or all array members if the instance forms an array) for the given layer. If the layer is empty in this cell and all its children', an empty bounding box will be returned. This method has been introduced in version 0.25. 'bbox' is the preferred synonym for it since version 0.28. """ def change_pcell_parameter(self, name: str, value: Any) -> None: @@ -24040,14 +24039,14 @@ class Instance: r""" @brief Gets the layout this instance is contained in - This const version of the method has been introduced in version 0.25. + This method has been introduced in version 0.22. """ @overload def layout(self) -> Layout: r""" @brief Gets the layout this instance is contained in - This method has been introduced in version 0.22. + This const version of the method has been introduced in version 0.25. """ def pcell_declaration(self) -> PCellDeclaration_Native: r""" @@ -25461,10 +25460,26 @@ class LayerInfo: @brief Equivalence of two layer info objects @return True, if both are equivalent - First, layer and datatype are compared. The name is of second order and used only if no layer or datatype is given. - This is basically a weak comparison that reflects the search preferences. + First, layer and datatype are compared. The name is of second order and used only if no layer or datatype is given for one of the operands. + This is basically a weak comparison that reflects the search preferences. It is the basis for \Layout#find_layer. + Here are some examples: - This method was added in version 0.18. + @code + # no match as layer/datatypes or names differ: + RBA::LayerInfo::new(1, 17).is_equivalent?(RBA::LayerInfo::new(1, 18)) -> false + RBA::LayerInfo::new('metal1').is_equivalent?(RBA::LayerInfo::new('m1')) -> false + # exact match for numbered or named layers: + RBA::LayerInfo::new(1, 17).is_equivalent?(RBA::LayerInfo::new(1, 17)) -> true + RBA::LayerInfo::new('metal1').is_equivalent?(RBA::LayerInfo::new('metal1')) -> true + # match as names are second priority over layer/datatypes: + RBA::LayerInfo::new(1, 17, 'metal1').is_equivalent?(RBA::LayerInfo::new(1, 17, 'm1')) -> true + # match as name matching is fallback: + RBA::LayerInfo::new(1, 17, 'metal1').is_equivalent?(RBA::LayerInfo::new('metal1')) -> true + # no match as neither names or layer/datatypes match: + RBA::LayerInfo::new(1, 17, 'metal1').is_equivalent?(RBA::LayerInfo::new('m1')) -> false + @/code + + This method was added in version 0.18 and modified to compare non-named vs. named layers in version 0.28.11. """ def is_named(self) -> bool: r""" @@ -26867,7 +26882,18 @@ class Layout: If a layer with the given properties already exists, this method will return the index of that layer.If no such layer exists, it will return nil. - This method has been introduced in version 0.23. + In contrast to \layer, this method will also find layers matching by name only. For example: + + @code + # finds layer '17/0' and 'name (17/0)': + index = layout.find_layer(RBA::LayerInfo::new(17, 0)) + # finds layer 'name' (first priority), but also 'name (17/0)' (second priority): + index = layout.find_layer(RBA::LayerInfo::new('name')) + # note that this will not match layer 'name (17/0)' and create a new name-only layer: + index = layout.layer(RBA::LayerInfo::new('name')) + @/code + + This method has been introduced in version 0.23 and has been extended to name queries in version 0.28.11. """ @overload def find_layer(self, layer: int, datatype: int) -> Any: @@ -26894,7 +26920,16 @@ class Layout: If a layer with the given name already exists, this method will return the index of that layer.If no such layer exists, it will return nil. - This method has been introduced in version 0.23. + In contrast to \layer, this method will also find numbered layers if the name matches. For example: + + @code + # finds layer 'name' (first priority), but also 'name (17/0)' (second priority): + index = layout.find_layer('name') + # note that this will not match layer 'name (17/0)' and create a new name-only layer: + index = layout.layer('name') + @/code + + This method has been introduced in version 0.23 and has been extended to name queries in version 0.28.11. """ def flatten(self, cell_index: int, levels: int, prune: bool) -> None: r""" @@ -26952,7 +26987,7 @@ class Layout: r""" @brief Inserts an edge pair collection into the given cell and layer If the edge pair collection is (conceptionally) flat, it will be inserted into the cell's shapes list as a flat sequence of edge pairs. - If the edge pair collection is deep (hierarchical), it will create a subhierarchy below the given cell and it's edge pairs will be put into the respective cells. Suitable subcells will be picked for inserting the edge pairs. If a hierarchy already exists below the given cell, the algorithm will try to reuse this hierarchy. + If the edge pair collection is deep (hierarchical), it will create a subhierarchy below the given cell and its edge pairs will be put into the respective cells. Suitable subcells will be picked for inserting the edge pairs. If a hierarchy already exists below the given cell, the algorithm will try to reuse this hierarchy. This method has been introduced in version 0.27. """ @@ -26961,7 +26996,7 @@ class Layout: r""" @brief Inserts an edge collection into the given cell and layer If the edge collection is (conceptionally) flat, it will be inserted into the cell's shapes list as a flat sequence of edges. - If the edge collection is deep (hierarchical), it will create a subhierarchy below the given cell and it's edges will be put into the respective cells. Suitable subcells will be picked for inserting the edges. If a hierarchy already exists below the given cell, the algorithm will try to reuse this hierarchy. + If the edge collection is deep (hierarchical), it will create a subhierarchy below the given cell and its edges will be put into the respective cells. Suitable subcells will be picked for inserting the edges. If a hierarchy already exists below the given cell, the algorithm will try to reuse this hierarchy. This method has been introduced in version 0.26. """ @@ -26970,7 +27005,7 @@ class Layout: r""" @brief Inserts a region into the given cell and layer If the region is (conceptionally) a flat region, it will be inserted into the cell's shapes list as a flat sequence of polygons. - If the region is a deep (hierarchical) region, it will create a subhierarchy below the given cell and it's shapes will be put into the respective cells. Suitable subcells will be picked for inserting the shapes. If a hierarchy already exists below the given cell, the algorithm will try to reuse this hierarchy. + If the region is a deep (hierarchical) region, it will create a subhierarchy below the given cell and its shapes will be put into the respective cells. Suitable subcells will be picked for inserting the shapes. If a hierarchy already exists below the given cell, the algorithm will try to reuse this hierarchy. This method has been introduced in version 0.26. """ @@ -26979,7 +27014,7 @@ class Layout: r""" @brief Inserts an text collection into the given cell and layer If the text collection is (conceptionally) flat, it will be inserted into the cell's shapes list as a flat sequence of texts. - If the text collection is deep (hierarchical), it will create a subhierarchy below the given cell and it's texts will be put into the respective cells. Suitable subcells will be picked for inserting the texts. If a hierarchy already exists below the given cell, the algorithm will try to reuse this hierarchy. + If the text collection is deep (hierarchical), it will create a subhierarchy below the given cell and its texts will be put into the respective cells. Suitable subcells will be picked for inserting the texts. If a hierarchy already exists below the given cell, the algorithm will try to reuse this hierarchy. This method has been introduced in version 0.27. """ @@ -28663,7 +28698,7 @@ class LayoutToNetlist: @li Preparation In this step, the device recognition and extraction layers are drawn from the framework. Derived can now be computed using boolean operations. - Methods to use in this step are \make_layer and it's variants. + Methods to use in this step are \make_layer and its variants. Layer preparation is not necessarily required to happen before all other steps. Layers can be computed shortly before they are required. @/li @@ -28674,7 +28709,7 @@ class LayoutToNetlist: may be specified here. Layer preparation may happen between calls to \extract_devices. @/li @li Once the devices are derived, the netlist connectivity can be defined and the - netlist extracted. The connectivity is defined with \connect and it's + netlist extracted. The connectivity is defined with \connect and its flavours. The actual netlist extraction happens with \extract_netlist. @/li @li After netlist extraction, the information is ready to be retrieved. @@ -28721,12 +28756,12 @@ class LayoutToNetlist: @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares two enums + @brief Compares an enum with an integer value """ @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer value + @brief Compares two enums """ @overload def __init__(self, i: int) -> None: @@ -28751,12 +28786,12 @@ class LayoutToNetlist: @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares two enums for inequality + @brief Compares an enum with an integer for inequality """ @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer for inequality + @brief Compares two enums for inequality """ def __repr__(self) -> str: r""" @@ -29207,7 +29242,7 @@ class LayoutToNetlist: def connect(self, l: Region) -> None: r""" @brief Defines an intra-layer connection for the given layer. - The layer is either an original layer created with \make_includelayer and it's variants or + The layer is either an original layer created with \make_includelayer and its variants or a derived layer. Certain limitations apply. It's safe to use boolean operations for deriving layers. Other operations are applicable as long as they are capable of delivering hierarchical layers. @@ -29273,7 +29308,7 @@ class LayoutToNetlist: @brief Extracts devices See the class description for more details. This method will run device extraction for the given extractor. The layer map is specific - for the extractor and uses the region objects derived with \make_layer and it's variants. + for the extractor and uses the region objects derived with \make_layer and its variants. In addition, derived regions can be passed too. Certain limitations apply. It's safe to use boolean operations for deriving layers. Other operations are applicable as long as they are @@ -30008,12 +30043,12 @@ class LoadLayoutOptions: @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer value + @brief Compares two enums """ @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares two enums + @brief Compares an enum with an integer value """ @overload def __init__(self, i: int) -> None: @@ -30038,12 +30073,12 @@ class LoadLayoutOptions: @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares two enums for inequality + @brief Compares an enum with an integer for inequality """ @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer for inequality + @brief Compares two enums for inequality """ def __repr__(self) -> str: r""" @@ -30291,12 +30326,12 @@ class LoadLayoutOptions: dxf_keep_other_cells: bool r""" Getter: - @brief If this option is true, all cells are kept, not only the top cell and it's children + @brief If this option is true, all cells are kept, not only the top cell and its children This property has been added in version 0.21.15. Setter: - @brief If this option is set to true, all cells are kept, not only the top cell and it's children + @brief If this option is set to true, all cells are kept, not only the top cell and its children This property has been added in version 0.21.15. """ @@ -32567,14 +32602,14 @@ class NetPinRef: @overload def net(self) -> Net: r""" - @brief Gets the net this pin reference is attached to (non-const version). - - This constness variant has been introduced in version 0.26.8 + @brief Gets the net this pin reference is attached to. """ @overload def net(self) -> Net: r""" - @brief Gets the net this pin reference is attached to. + @brief Gets the net this pin reference is attached to (non-const version). + + This constness variant has been introduced in version 0.26.8 """ def pin(self) -> Pin: r""" @@ -33595,16 +33630,16 @@ class Netlist: @overload def circuit_by_cell_index(self, cell_index: int) -> Circuit: r""" - @brief Gets the circuit object for a given cell index. + @brief Gets the circuit object for a given cell index (const version). If the cell index is not valid or no circuit is registered with this index, nil is returned. + + This constness variant has been introduced in version 0.26.8. """ @overload def circuit_by_cell_index(self, cell_index: int) -> Circuit: r""" - @brief Gets the circuit object for a given cell index (const version). + @brief Gets the circuit object for a given cell index. If the cell index is not valid or no circuit is registered with this index, nil is returned. - - This constness variant has been introduced in version 0.26.8. """ @overload def circuit_by_name(self, name: str) -> Circuit: @@ -33739,7 +33774,7 @@ class Netlist: def flatten_circuit(self, circuit: Circuit) -> None: r""" @brief Flattens a subcircuit - This method will substitute all instances (subcircuits) of the given circuit by it's contents. After this, the circuit is removed. + This method will substitute all instances (subcircuits) of the given circuit by its contents. After this, the circuit is removed. """ @overload def flatten_circuit(self, pattern: str) -> None: @@ -36278,12 +36313,12 @@ class PCellParameterState: @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares two enums + @brief Compares an enum with an integer value """ @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer value + @brief Compares two enums """ @overload def __init__(self, i: int) -> None: @@ -38340,7 +38375,7 @@ class Polygon: r""" @brief Returns true, if the polygon is a simple box. - A polygon is a box if it is identical to it's bounding box. + A polygon is a box if it is identical to its bounding box. @return True if the polygon is a box. @@ -38900,12 +38935,12 @@ class PreferredOrientation: @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer value + @brief Compares two enums """ @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares two enums + @brief Compares an enum with an integer value """ @overload def __init__(self, i: int) -> None: @@ -39085,12 +39120,12 @@ class PropertyConstraint: @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares two enums + @brief Compares an enum with an integer value """ @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer value + @brief Compares two enums """ @overload def __init__(self, i: int) -> None: @@ -39115,12 +39150,12 @@ class PropertyConstraint: @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer for inequality + @brief Compares two enums for inequality """ @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares two enums for inequality + @brief Compares an enum with an integer for inequality """ def __repr__(self) -> str: r""" @@ -40583,12 +40618,12 @@ class Region(ShapeCollection): @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares two enums for inequality + @brief Compares an enum with an integer for inequality """ @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer for inequality + @brief Compares two enums for inequality """ def __repr__(self) -> str: r""" @@ -40689,12 +40724,12 @@ class Region(ShapeCollection): @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer for inequality + @brief Compares two enums for inequality """ @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares two enums for inequality + @brief Compares an enum with an integer for inequality """ def __repr__(self) -> str: r""" @@ -44262,11 +44297,10 @@ class Shape: Starting with version 0.23, this method returns nil, if the shape does not represent a box. Setter: - @brief Replaces the shape by the given box - This method replaces the shape by the given box. This method can only be called for editable layouts. It does not change the user properties of the shape. - Calling this method will invalidate any iterators. It should not be called inside a loop iterating over shapes. + @brief Replaces the shape by the given box (in micrometer units) + This method replaces the shape by the given box, like \box= with a \Box argument does. This version translates the box from micrometer units to database units internally. - This method has been introduced in version 0.22. + This method has been introduced in version 0.25. """ box_center: Point r""" @@ -44572,10 +44606,11 @@ class Shape: Starting with version 0.23, this method returns nil, if the shape does not represent an edge. Setter: - @brief Replaces the shape by the given edge (in micrometer units) - This method replaces the shape by the given edge, like \edge= with a \Edge argument does. This version translates the edge from micrometer units to database units internally. + @brief Replaces the shape by the given edge + This method replaces the shape by the given edge. This method can only be called for editable layouts. It does not change the user properties of the shape. + Calling this method will invalidate any iterators. It should not be called inside a loop iterating over shapes. - This method has been introduced in version 0.25. + This method has been introduced in version 0.22. """ edge_pair: Any r""" @@ -44624,11 +44659,10 @@ class Shape: Starting with version 0.23, this method returns nil, if the shape does not represent a path. Setter: - @brief Replaces the shape by the given path object - This method replaces the shape by the given path object. This method can only be called for editable layouts. It does not change the user properties of the shape. - Calling this method will invalidate any iterators. It should not be called inside a loop iterating over shapes. + @brief Replaces the shape by the given path (in micrometer units) + This method replaces the shape by the given path, like \path= with a \Path argument does. This version translates the path from micrometer units to database units internally. - This method has been introduced in version 0.22. + This method has been introduced in version 0.25. """ path_bgnext: int r""" @@ -44736,10 +44770,11 @@ class Shape: Starting with version 0.23, this method returns nil, if the shape does not represent a geometrical primitive that can be converted to a polygon. Setter: - @brief Replaces the shape by the given polygon (in micrometer units) - This method replaces the shape by the given polygon, like \polygon= with a \Polygon argument does. This version translates the polygon from micrometer units to database units internally. + @brief Replaces the shape by the given polygon object + This method replaces the shape by the given polygon object. This method can only be called for editable layouts. It does not change the user properties of the shape. + Calling this method will invalidate any iterators. It should not be called inside a loop iterating over shapes. - This method has been introduced in version 0.25. + This method has been introduced in version 0.22. """ prop_id: int r""" @@ -47559,7 +47594,7 @@ class SimplePolygon: r""" @brief Returns a value indicating whether the polygon is a simple box. - A polygon is a box if it is identical to it's bounding box. + A polygon is a box if it is identical to its bounding box. @return True if the polygon is a box. @@ -48386,7 +48421,7 @@ class Technology: class TechnologyComponent: r""" @brief A part of a technology definition - Technology components extend technology definitions (class \Technology) by specialized subfeature definitions. For example, the net tracer supplies it's technology-dependent specification through a technology component called \NetTracerTechnology. + Technology components extend technology definitions (class \Technology) by specialized subfeature definitions. For example, the net tracer supplies its technology-dependent specification through a technology component called \NetTracerTechnology. Components are managed within technologies and can be accessed from a technology using \Technology#component. @@ -48572,8 +48607,7 @@ class Text: Setter: @brief Sets the vertical alignment - This property specifies how the text is aligned relative to the anchor point. - This property has been introduced in version 0.22 and extended to enums in 0.28. + This is the version accepting integer values. It's provided for backward compatibility. """ x: int r""" @@ -51451,7 +51485,7 @@ class Utils: r""" @brief This function computes the Spline curve for a given set of control points (point, weight), degree and knots. - The knot vector needs to be padded and it's size must fulfill the condition: + The knot vector needs to be padded and its size must fulfill the condition: @code knots.size == control_points.size + degree + 1 @@ -51609,12 +51643,12 @@ class VAlign: @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer value + @brief Compares two enums """ @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares two enums + @brief Compares an enum with an integer value """ @overload def __init__(self, i: int) -> None: @@ -52458,7 +52492,7 @@ class VCplxTrans: r""" @brief Inverts the transformation (in place) - Inverts the transformation and replaces this transformation by it's + Inverts the transformation and replaces this transformation by its inverted one. @return The inverted transformation diff --git a/src/pymod/distutils_src/klayout/laycore.pyi b/src/pymod/distutils_src/klayout/laycore.pyi index e7e81e9c52..19f1cd9086 100644 --- a/src/pymod/distutils_src/klayout/laycore.pyi +++ b/src/pymod/distutils_src/klayout/laycore.pyi @@ -1826,9 +1826,9 @@ class CellView: is addressed by an cell_index or a cell object reference. The layout pointer can be nil, indicating that the cell view is invalid. - The cell is not only identified by it's index or object but also + The cell is not only identified by its index or object but also by the path leading to that cell. This path indicates how to find the - cell in the hierarchical context of it's parent cells. + cell in the hierarchical context of its parent cells. The path is in fact composed of two parts: first in an unspecific fashion, just describing which parent cells are used. The target of this path @@ -1874,7 +1874,7 @@ class CellView: This method will construct any path to this cell, not a particular one. It will clear the context path - and update the context and target cell. Note that the cell is specified by it's index. + and update the context and target cell. Note that the cell is specified by its index. """ cell_name: str r""" @@ -2148,7 +2148,7 @@ class CellView: This method will construct any path to this cell, not a particular one. It will clear the context path - and update the context and target cell. Note that the cell is specified by it's index. + and update the context and target cell. Note that the cell is specified by its index. """ def set_cell_name(self, cell_name: str) -> None: r""" @@ -2698,24 +2698,26 @@ class Image(BasicImage): """ @overload @classmethod - def new(cls, filename: str) -> Image: + def new(cls, filename: str, trans: Optional[db.DCplxTrans] = ...) -> Image: r""" - @brief Constructor from a image file + @brief Constructor from a image file This constructor creates an image object from a file (which can have any format supported by Qt) and - a unit transformation. The image will originally be put to position 0,0 (lower left corner) and each pixel - will have a size of 1 (micron). + a transformation. The image will originally be put to position 0,0 (lower left corner) and each pixel + will have a size of 1. The transformation describes how to transform this image into micron space. @param filename The path to the image file to load. + @param trans The transformation to apply to the image when displaying it. """ @overload @classmethod - def new(cls, filename: str, trans: db.DCplxTrans) -> Image: + def new(cls, pixels: PixelBuffer, trans: Optional[db.DCplxTrans] = ...) -> Image: r""" - @brief Constructor from a image file + @brief Constructor from a image pixel buffer - This constructor creates an image object from a file (which can have any format supported by Qt) and - a transformation. The image will originally be put to position 0,0 (lower left corner) and each pixel + This constructor creates an image object from a pixel buffer object. This object holds RGB or mono image data similar to QImage, except it is available also when Qt is not available (e.g. inside the Python module). + + The image will originally be put to position 0,0 (lower left corner) and each pixel will have a size of 1. The transformation describes how to transform this image into micron space. @param filename The path to the image file to load. @@ -2812,23 +2814,25 @@ class Image(BasicImage): Use the \read_file or \set_data methods to set image properties and pixel values. """ @overload - def __init__(self, filename: str) -> None: + def __init__(self, filename: str, trans: Optional[db.DCplxTrans] = ...) -> None: r""" - @brief Constructor from a image file + @brief Constructor from a image file This constructor creates an image object from a file (which can have any format supported by Qt) and - a unit transformation. The image will originally be put to position 0,0 (lower left corner) and each pixel - will have a size of 1 (micron). + a transformation. The image will originally be put to position 0,0 (lower left corner) and each pixel + will have a size of 1. The transformation describes how to transform this image into micron space. @param filename The path to the image file to load. + @param trans The transformation to apply to the image when displaying it. """ @overload - def __init__(self, filename: str, trans: db.DCplxTrans) -> None: + def __init__(self, pixels: PixelBuffer, trans: Optional[db.DCplxTrans] = ...) -> None: r""" - @brief Constructor from a image file + @brief Constructor from a image pixel buffer - This constructor creates an image object from a file (which can have any format supported by Qt) and - a transformation. The image will originally be put to position 0,0 (lower left corner) and each pixel + This constructor creates an image object from a pixel buffer object. This object holds RGB or mono image data similar to QImage, except it is available also when Qt is not available (e.g. inside the Python module). + + The image will originally be put to position 0,0 (lower left corner) and each pixel will have a size of 1. The transformation describes how to transform this image into micron space. @param filename The path to the image file to load. @@ -4453,7 +4457,7 @@ class LayerPropertiesIterator: @brief Returns the index of the child within the parent This method returns the index of that the properties node the iterator points to in the list - of children of it's parent. If the element does not have a parent, the + of children of its parent. If the element does not have a parent, the index of the element in the global list is returned. """ def create(self) -> None: @@ -4702,7 +4706,7 @@ class LayerPropertiesNode(LayerProperties): Each layer properties node object has a unique ID that is created when a new LayerPropertiesNode object is instantiated. The ID is copied when the object is copied. The ID can be used to identify the - object irregardless of it's content. + object irregardless of its content. """ def is_expanded(self) -> bool: r""" @@ -5381,7 +5385,7 @@ class LayoutViewBase: If a file is loaded, this event is triggered. When this event is triggered, the file was already loaded and the new file is the new active cellview. - Despite it's name, this event is also triggered if a layout object is loaded into the view. + Despite its name, this event is also triggered if a layout object is loaded into the view. Before version 0.25 this event was based on the observer pattern obsolete now. The corresponding methods (add_file_open_observer/remove_file_open_observer) have been removed in 0.25. @@ -5390,7 +5394,7 @@ class LayoutViewBase: If a file is loaded, this event is triggered. When this event is triggered, the file was already loaded and the new file is the new active cellview. - Despite it's name, this event is also triggered if a layout object is loaded into the view. + Despite its name, this event is also triggered if a layout object is loaded into the view. Before version 0.25 this event was based on the observer pattern obsolete now. The corresponding methods (add_file_open_observer/remove_file_open_observer) have been removed in 0.25. """ @@ -5446,7 +5450,7 @@ class LayoutViewBase: Getter: @brief An event indicating that the layer list has changed - This event is triggered after the layer list has changed it's configuration. + This event is triggered after the layer list has changed its configuration. The integer argument gives a hint about the nature of the changed: Bit 0 is set, if the properties (visibility, color etc.) of one or more layers have changed. Bit 1 is set if the hierarchy has changed. Bit 2 is set, if layer names have changed. @@ -5455,7 +5459,7 @@ class LayoutViewBase: Setter: @brief An event indicating that the layer list has changed - This event is triggered after the layer list has changed it's configuration. + This event is triggered after the layer list has changed its configuration. The integer argument gives a hint about the nature of the changed: Bit 0 is set, if the properties (visibility, color etc.) of one or more layers have changed. Bit 1 is set if the hierarchy has changed. Bit 2 is set, if layer names have changed. @@ -6067,7 +6071,7 @@ class LayoutViewBase: r""" @brief Hierarchically iterates over the layers in the given layer list - This version of this method allows specification of the layer list to be iterated over. The layer list is specified by it's index which is a value between 0 and \num_layer_lists-1.For details see the parameter-less version of this method. + This version of this method allows specification of the layer list to be iterated over. The layer list is specified by its index which is a value between 0 and \num_layer_lists-1.For details see the parameter-less version of this method. This method was introduced in version 0.25. """ @@ -7200,12 +7204,12 @@ class Macro: @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer value + @brief Compares two enums """ @overload def __eq__(self, other: object) -> bool: r""" - @brief Compares two enums + @brief Compares an enum with an integer value """ @overload def __init__(self, i: int) -> None: @@ -7230,12 +7234,12 @@ class Macro: @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares an enum with an integer for inequality + @brief Compares two enums for inequality """ @overload def __ne__(self, other: object) -> bool: r""" - @brief Compares two enums for inequality + @brief Compares an enum with an integer for inequality """ def __repr__(self) -> str: r""" @@ -8926,7 +8930,7 @@ class Plugin: r""" @brief The plugin object - This class provides the actual plugin implementation. Each view gets it's own instance of the plugin class. The plugin factory \PluginFactory class must be specialized to provide a factory for new objects of the Plugin class. See the documentation there for details about the plugin mechanism and the basic concepts. + This class provides the actual plugin implementation. Each view gets its own instance of the plugin class. The plugin factory \PluginFactory class must be specialized to provide a factory for new objects of the Plugin class. See the documentation there for details about the plugin mechanism and the basic concepts. This class has been introduced in version 0.22. """ diff --git a/src/pymod/distutils_src/klayout/rdbcore.pyi b/src/pymod/distutils_src/klayout/rdbcore.pyi index 53dbdc1955..9e052a27b0 100644 --- a/src/pymod/distutils_src/klayout/rdbcore.pyi +++ b/src/pymod/distutils_src/klayout/rdbcore.pyi @@ -176,7 +176,7 @@ class RdbCategory: def scan_layer(self, layout: db.Layout, layer: int, cell: Optional[db.Cell] = ..., levels: Optional[int] = ..., with_properties: Optional[bool] = ...) -> None: r""" @brief Scans a layer from a layout into this category, starting with a given cell and a depth specification - Creates RDB items for each polygon or edge shape read from the cell and it's children in the layout on the given layer and puts them into this category. + Creates RDB items for each polygon or edge shape read from the cell and its children in the layout on the given layer and puts them into this category. New cells will be generated when required. "levels" is the number of hierarchy levels to take the child cells from. 0 means to use only "cell" and don't descend, -1 means "all levels". Other settings like database unit, description, top cell etc. are not made in the RDB. @@ -299,7 +299,7 @@ class RdbCell: def name(self) -> str: r""" @brief Gets the cell name - The cell name is an string that identifies the category in the database. Additionally, a cell may carry a variant identifier which is a string that uniquely identifies a cell in the context of it's variants. The "qualified name" contains both the cell name and the variant name. Cell names are also used to identify report database cell's with layout cells. @return The cell name + The cell name is an string that identifies the category in the database. Additionally, a cell may carry a variant identifier which is a string that uniquely identifies a cell in the context of its variants. The "qualified name" contains both the cell name and the variant name. Cell names are also used to identify report database cell's with layout cells. @return The cell name """ def num_items(self) -> int: r""" @@ -995,7 +995,7 @@ class ReportDatabase: r""" Getter: @brief Gets the databases description - The description is a general purpose string that is supposed to further describe the database and it's content in a human-readable form. + The description is a general purpose string that is supposed to further describe the database and its content in a human-readable form. @return The description string Setter: diff --git a/version.sh b/version.sh index 37539b8c71..f3842abd65 100644 --- a/version.sh +++ b/version.sh @@ -2,10 +2,10 @@ # This script is sourced to define the main version parameters # The main version -KLAYOUT_VERSION="0.28.10" +KLAYOUT_VERSION="0.28.11" # The version used for PyPI (don't use variables here!) -KLAYOUT_PYPI_VERSION="0.28.10" +KLAYOUT_PYPI_VERSION="0.28.11" # The build date KLAYOUT_VERSION_DATE=$(date "+%Y-%m-%d")