We are happy to announce that NAZCA 0.5.4 is available for download!

Nazca is available for Linux, Mac and Windows, for Python 3.6 up.

DOWNLOAD Nazca 0.5.4 installer

This Nazca Installer does not include the pyclipper module.
The pyclipper module can be installed separately (
see the installation guide).

Click here for the step by step installation guide.


We encourage you to put the Nazca logo in your mask layout and share a picture with us if you can.

Show your appreciation for Nazca Design by acknowledging it in your work, publications or materials with the following sentence:

Nazca Design was used to generate the mask layout in this work.

What’s new in NAZCA 0.5.4

2019-10-09: nazca.0.5.4

  • – text:
    • – added OCR-B font
    • – added option to override cell name of text

  • – annotations:
    • – updated text type to allow for non-zero text types

  • – mask export:
    • – when using keyword layermap in export_gds() remove the layers mapped to None. They where moved to the Nazca “dump-layer” instead.

  • – netlist:
    • – added the ‘pathfinder’ function to check for circuit integrity: nd.pathfinder(start=<pin>)
    • – added option to raise an exception upon netlist errors (see function netlist_raise())

  •  – bounding box: updated bounding box concepts, available are the following:
    • – bbox: a square bounding box enclosing all internal components and bboxes
    • – userbbox: free bbox polygon (may be non-rectangular: has no bbox pins)
    • – hull: convex hull (may be non-rectangular: has no bbox pins)

  • – Interconnects:
    • – added functionality for asymmetrical trench layers and multiple waveguides in a single interconnect
    • – implemented initial array connectivity with circuit integrity. To be integrated with the Interconnect class.
    • – removed an obsolete raise for bend radii < 0
    • – added Rmin attribute to cobra_p2p
    • – added option to raise an exception upon interconnect errors (see function interconnect_raise())
    • – fixed strt_p2p() interconnect (tip: use bend_strt_bend_p2p() for waveguide connections)

  • – pin2pin DRC:
    • – added functionality to check for directional connections (xsection attribute symmetry = False)
    • – moved settings to pin2pin drc settings to
    • – no longer by default DRC check xs and width on discontinues jumps e.g. via move(dx, dy)

  • – throw an exception when forgetting an @hashme decorator when expected after using it in Cell().
  • – allow for setting a custom layer in show_cp() and show_pin()
  • – added formatted pin coordinate methods pin.fxya() and pin.fxy() with default 3 digits
  • – updated __repr__ to clearly indentify Cells vs. Instances
  • – refactored cell_iteration from recursive to iterative
  • – number of smaller updates and fixes.

Previous releases

Release date: 2019-07-16


  • – Added a function for easier setting and accessing angle DRC on instances.
  • – Fixed issue in 0.5.2 for tapers and ptapers of length = 0
  • – Improved docstrings.

Release date: 2019-06-26


  • – replace f-string for .format() strings to remain Python 3.5 compatible for now.
  • – added easier access to the Cell object of an Instance object. Previous syntax instance.cnode.cell can now also be written as instance.cell
  • – updated mask_element warnings with cellname information.
  • – fixed midpoint() and midpointer() to give a well defined angle lying between the smallest angle opening between two pins angles in orientation, and between 0 and 360 degrees in value.
  • – added layer keyword in show_pin(). It was always using layer=1 before.
  • – correction in load_gdsBB() to add a bbox when stubs=True
  • – added a default mask layer ‘bb_flag’ to identify IP-blocks.

  • – pin-2-pin DRC:
    • – switched on pin-2-pin DRC including logging and gds visualisation. DRC checks on width, angle and xsection. Rules are xsection dependent.
    • – added pin2pin DRC examples to the demofab PDK.

  • – GDS export:
    • – when exporting GDS, first write to a tmp file. This provided a smoother interaction with KLayout auto-reload to only pop-up when the export is complete.
    • – force utf-8 coding in ascii-based gds output for Windows systems
    • – updated gds export to always have an STRANS record and MAG record for higher cross-tool compatibility
    • – fixed reading of magnification record MAG in gds array’s.
    • – added submit to export to set a boolean flag that export files about the design
    • – pass texttype to gds annotations. Was always 0 before.

  • – Interconnects:
    • – added method cobra_p2p(), which was previously called pcurve(). It now also comes with input width1 to output width2 options.
    • – added the option to an Interconnect object to override the straight-to-bend offset function stored in the xsection.
    • – fixed width override in method rot2ref(). It always used the default width before.

  • – Netlisting:
    • – improve Interconnect cellnames with ‘ic_’ prefix for more meaningful names in a netlist expansion.
    • – fixed internal pin name of ‘org’ pin from an id number to ‘org’.
    • – keep original pins in p2p connection parsing where possible. This provides a more direct connectivity for netlists.

Release date: 2019-05-14


  • – implemented a logging module in Nazca based on standard Python logging. Usage example: after ‘import nazca as nd’ add nd.logfile(name=__file__, stdout=False) to save logging output to file and no longer to stdout.
  • – updates in interconnects:
    • – added the ‘viper()’ method to define parameterized guides as function of parameter t according to x(t), y(t), w(t) for position (x, y) and width w.
      – updated method ‘polyline2polygon()’ to handle a variable line widths along the polyline.
      – updated the ‘sbend()’ method in Interconnect for more options in the straight sections.
      – added ‘varname’ and ‘doc’ attributes to help document Interconnect objects.
      – added ‘tube()’ interconnect concept and method.
      – fixed the ‘ubend()’ interconnect method in case of using ‘end-angle’ in a call.
  • – updates in method ‘load_gds()’:
    • – added option to load all cells when asdict=True by setting topcellsonly=False.
      – allow for an instantiate=False option to dissolve a gds in a parent cell (under setting native=True. This can be useful to apply patches or updates to the gds without extending the hierarchy of it in the layout.
      – added the ‘reuse’ option to waive cellname conflicts.
      – set gds path-type to 0 if the loaded gds does not define any (under setting native=True).
  • – added the ‘properties’ dictionary to Cell objects for easy centralized setting and retrieval of cell attributes.
  • – added the ‘md5’ parameter option to method ‘export_gds()’ to generate the md5sum of the gds.
  • – added a module for angle DRC of cells to check their place with respect to the topcell.
  • – updates related to method ‘cell_iter()’:
    • – in method ‘cell_iter()’, extended named_tuples for ‘open’ and ‘close’ cell conditions. If names are defined in both cases it allows for more flexible flow control across ‘open’ and ‘close’ cases.
    • – renamed in the yielded named-tuple the parameter ‘cell_name’ to ‘new_cell_name’.
    • – added gds scaling to class ‘clsNazca’ for replacing instances during cell iteration.
  • – added the hull-based bbox as option to Cell parameters and applied fixes to the hull.
  • – extended in-gds cell replacement to be able to use multiple libraries at once.
  • – updated Pin creation to automatically use the xsection width setting if only the xsection is provided to Pin.
  • – provided handles in the cfg module for setting maximum instantiation of the Nazca hierarchy: instantiate_pin, instantiate_stub, instantiate_mask_element (defaults all False). Boolean flags to ‘mask_elements’, ‘Interconnect’ and stubs have been added for this.
  • – layer colors:
    • – updated color handling by adding colorIDs based on (layer, datatype)
    • – added function colors2csv to export Nazca color table to csv.
    • – added nazca colors to lyp export
  • – improved ‘pinstyle’ handling. It is possible to predefine any number of pin-styles for visualization individual xsection and interconnect connectivity.
  • – updated the ‘version’ attribute in cell from a string content to a Python dictionary format.
  • – updated add-layer() method to handle str type layers.
  • – added ‘top-down’ option in method ‘cell_iter()’ (default is bottom-up)
  • – fixed show_cp() to properly reference current pointer cp.
  • – added ‘layermapping’ option for layout export. This is in addition to existing mapping during loading.
  • – added the ‘description’ attribute to the layer table
  • – added the ‘description’ attribute to the xsection table.
  • – improved ‘origin’ tracking of new xsection generation.
  • – removed default width and radius setting for Xsections (change setting to None). Not all xections are waveguides.
  • – fixed and improved handling of unknown layers.
  • – many other small improvements and docstring updates.


Release date: 2019-02-20


  • – changed name of to
  • – use layer_name as layer ID instead of (layer, datatype). Note that get_layer() will now return the layer_name string.
  • – in PDKs the xsection to layer maps now use layer_name as reference key.
  • – added properties dictionary in cells to store information on a cell in one place (length, width, parameter values, owner, etc.).
  • – updated @hashme decorator to keep unique cellnames now also for functions without default values.
  • – added raised_sine interconnect.
  • – provide access to change all default Pin attribute settings when creating a new pin.
  • – changed keywords in pcurve function to nazca convention, i.e. ‘radius’, ‘width’, ‘offset’.
  • – added technology attribute to internal nazca layers to handle multiple technologies in a single design.
  • – load_gds() can now load all gds cells at once in a dictionary of cells with asdict=True avoiding multiple loads.
  • – load_gds() can now read bytestrings besides files.
  • – fixed box around text with a \n linefeed in the text. It now follows the text.
  • – added switch in cfg to temporarily by-pass type-checking raised exceptions in BB-generating function calls.
  • – updated show_cp() to show a specific pin, not only the cp.
  • – fixed bug in generic_bend for downward starting curves
  • – fixed scaling option in nazca-design logo.
  • – removed duplicate placements in whitebox cell replacements.
  • – added check on overlapping polyline points.
  • – updated BB export files generated by export_gds.
  • – cleaned up parsing of put() statements.
  • – lots of small improvements (docstrings, checks and small fixes).



Release date: 2018-07-31


  • -Implemented decomposing and rebuilding of cells at user level; Map layers and cellnames and/or change, add, delete, replace, scale and/or translate polygons, polylines, cells, annotations and/or gds array settings.
  • -Added flip, flop and scale to polygon and polyline placement (put).
  • -Added more methods to the polygon and polylines for simpler usage and more flexibility.
  • -Improved scaling behaviour for gds loading.
  • -Introduced convex hulls as basis of rotation-proof bounding box calculations.
  • -Implemented option to store building block connectivity inside the GDS.
  • -Improved default layer and xsection handling in Interconnects for tutorial mode.
  • -Added strt_p2l interconnect.
  • -Lots of small improvements (docstrings, checks and small fixes).


Release date: 2018-06-06


  • -Implemented a clear separation between cell-tree iteration and layout generation, which will enable many new features (to be extended).
  • -Based on the above, implemented a cell method to rebuild a cell inside Nazca before export to any available format, e.g. split a cell in a subcell per gds layer.
  • -Updated range_check method with +/-inf settings.
  • -Lots of small improvements (docstrings, checks, small fixes).

Release date: 2018-04-15


  • -Added bb=True option to export_gds() to facilitate building block creation, sharing and loading.
  • -Extended mirroring options in cell placement:
    flip=True: mirror by “rotation” in the connecting pin axis
    flop=True: mirror by “reversing the direction” of the connecting pin.
  • -Provided more “predictable” ‘org’ behavior by filtering ‘org’ from raise-pins().
  • -In load_gds the native=True setting can not change cell placement anymore:
    It now sets ‘org’ as default in/out pins (as it does for native=False), rather than adding ‘a0’ and ‘b0’ as default in/out.
  • -A number of small fixes.

Release date: 2018-03-06


  • – Implemented loading of gds files into fully native Nazca cell(s).
  • – Added parametric curves.
  • – Implemented direct pointer solving (at time of placement, rather than cell closure).
    It gives immediate access to pin coordinates (x, y, a).
  • – Implemented automated bounding box for cells (including array’s and native loaded gds).
  • – Added bounding box info to polygons and polylines.
  • – Export full gds to matplotlib/png (including array’s and native loaded gds).
  • – Export full gds to svg (including array’s and native loaded gds).
  • – Added module for tracing path-lengths.
  • – Pin, Polygon, Polyline and Annotation now all have a (mandatory) capital first letter to indicate they are classes.
  • – Interconnects that can not be drawn correctly are shown in a dedicated error layer.
  • – Improved stub handling, customize scaling, shapes or use cells as a stub.
  • – Improved ubend to connect guides < 2*radius apart.
  • – Improved doc-strings.
  • – Improved messages.
  • – Improved checking for cell name conflicts.
  • – Added cell name filter to make cellnames comply with specific foundry restrictions.
  • – Improved handling of missing xsections and layers.

Release date: 2017-11-22

The first public release.