{
  "$schema": "http://json-schema.org/draft/2020-12/schema",
  "$id": "https://academy.lucedaphotonics.com/schemas/1.0.0/tech-schema.json",
  "title": "PDK Tech Configuration",
  "description": "A JSON schema for PDK tech Configuration.",
  "$defs": {
    "lppAsStringOrStringTuple": {
      "description": "A generic lpp definition, either a single string (name in the lpp table) or an array containing layer and purpose",
      "oneOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "minItems": 2,
          "maxItems": 2
        }
      ]
    },
    "colorAsStringOrIntTriplet": {
      "description": "Color type as a string (either #12abc3, or html-string), or three ints",
      "oneOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 0,
            "maximum": 255
          },
          "minItems": 3,
          "maxItems": 3
        }
      ]
    }
  },
  "type": "object",
  "properties": {
    "version": {
      "description": "Version of the PDK",
      "type": "string"
    },
    "type": {
      "description": "Type of library, will influence how the technology will be loaded. default: pdk",
      "default": "pdk",
      "enum": [
        "pdk",
        "adk",
        "tdk"
      ]
    },
    "layers": {
      "description": "The list of layers",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The unique name of the layer. Case matters."
          },
          "number": {
            "type": "integer",
            "description": "The layer number. Will be auto-generated if absent."
          },
          "doc": {
            "type": "string",
            "description": "An optional description for the layer."
          },
          "ipkiss": {
            "type": "object",
            "title": "LayerIpkissProperties",
            "properties": {
              "name": {
                "type": "string",
                "description": "Ipkiss Process name (if different from normal name)"
              }
            }
          },
          "properties": {
            "type": "object",
            "description": "Freeform properties for the layer.",
            "additionalProperties": true
          }
        },
        "required": [
          "name"
        ]
      }
    },
    "purposes": {
      "description": "A list of purpose definitions for the layers. DRAWING is implicitly pre-defined",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The name of the purpose (e.g., DOC, Cladding)."
          },
          "number": {
            "type": "integer",
            "description": "The purpose number. Will be auto-generated if absent."
          },
          "doc": {
            "type": "string",
            "description": "An optional description of the purpose"
          },
          "ipkiss": {
            "type": "object",
            "title": "PurposeIpkissProperties",
            "properties": {
              "name": {
                "type": "string",
                "description": "Ipkiss Purpose name (if different from normal name)"
              },
              "extension": {
                "type": "string",
                "description": "Extension of ipkiss purpose (if different from purpose name)"
              }
            }
          },
          "properties": {
            "type": "object",
            "description": "Freeform properties for the purpose.",
            "additionalProperties": true
          }
        },
        "required": [
          "name"
        ]
      }
    },
    "lpps": {
      "description": "Layer-purpose pair definitions. PPLayers in IPKISS terminology. These can be used as shorthands in lpp fields elsewhere. For all of the layers, [layer, \"DRAWING\"] will be added implicitly. Case matters.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "A unique name for the layer-purpose pair."
          },
          "lpp": {
            "type": "array",
            "description": "The layer-purpose pair as layer and purpose.",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "minItems": 2,
            "maxItems": 2
          },
          "doc": {
            "type": "string",
            "description": "An optional description of the layer-purpose pair"
          },
          "ipkiss": {
            "type": "object",
            "title": "LppIpkissProperties",
            "properties": {
              "name": {
                "type": "string",
                "description": "Ipkiss ProcessPurposeLayer name (if different from normal name)"
              },
              "tech_path": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "Path in the tech tree to the corresponding PatternPurposeLayer"
              }
            }
          },
          "properties": {
            "type": "object",
            "description": "Freeform properties for the lpp.",
            "additionalProperties": true
          }
        },
        "required": [
          "name",
          "lpp"
        ]
      }
    },
    "gds": {
      "description": "Configuration for GDS file export.",
      "type": "object",
      "properties": {
        "layer_table": {
          "description": "Mapping of layer names to GDS layer and datatype numbers.",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "lpp": {
                "$ref": "#/$defs/lppAsStringOrStringTuple",
                "description": "The layer purpose pair"
              },
              "number": {
                "type": "array",
                "description": "The GDS number for the layer",
                "items": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 65535
                },
                "minItems": 2,
                "maxItems": 2
              }
            }
          },
          "required": [
            "lpp",
            "number"
          ]
        },
        "export_options": {
          "description": "GDS export options",
          "type": "object",
          "properties": {
            "cut_path": {
              "type": "boolean",
              "default": true,
              "description": "default: True"
            },
            "path_to_boundary": {
              "type": "boolean",
              "default": true,
              "description": "default: True"
            },
            "path_to_boundary_layers": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/lppAsStringOrStringTuple"
              },
              "default": [],
              "description": "LPPs on which the path-to-boundary filter is applied default: []"
            },
            "path_to_boundary_exclude_layers": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/lppAsStringOrStringTuple"
              },
              "default": [],
              "description": "LPPs that are excluded from the path-to-boundary filter default: []"
            },
            "cut_boundary": {
              "type": "boolean",
              "default": true,
              "description": "default: True"
            },
            "write_empty": {
              "type": "boolean",
              "default": true,
              "description": "default: True"
            },
            "name_error_filter": {
              "type": "boolean",
              "default": false,
              "description": "default: False"
            },
            "strname_allowed_characters": {
              "type": "string",
              "description": "Allowed characters in GDSII stream names. default: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$ technology-key: TECH.GDSII.STRNAME_ALLOWED_CHARACTERS",
              "default": "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$",
              "x-techkey": "TECH.GDSII.STRNAME_ALLOWED_CHARACTERS"
            },
            "strname_character_dict": {
              "type": "object",
              "description": "Dictionary for replacing characters in GDSII stream names. default: {' -./': '_'} technology-key: TECH.GDSII.STRNAME_CHARACTER_DICT",
              "additionalProperties": {
                "type": "string"
              },
              "default": {
                " -./": "_"
              },
              "x-techkey": "TECH.GDSII.STRNAME_CHARACTER_DICT"
            },
            "max_name_length": {
              "type": "integer",
              "description": "Maximum length of GDSII stream names. default: 255 technology-key: TECH.GDSII.MAX_NAME_LENGTH",
              "default": 255,
              "x-techkey": "TECH.GDSII.MAX_NAME_LENGTH"
            },
            "max_coordinates": {
              "type": "integer",
              "description": "Maximum number of coordinates in GDSII paths. default: 200 technology-key: TECH.GDSII.MAX_COORDINATES",
              "default": 200,
              "x-techkey": "TECH.GDSII.MAX_COORDINATES"
            },
            "max_path_length": {
              "type": "integer",
              "description": "Maximum length of GDSII paths. default: 100 technology-key: TECH.GDSII.MAX_PATH_LENGTH",
              "default": 100,
              "x-techkey": "TECH.GDSII.MAX_PATH_LENGTH"
            },
            "max_vertex_count": {
              "type": "integer",
              "description": "Maximum number of vertices in GDSII boundaries. default: 4000 technology-key: TECH.GDSII.MAX_VERTEX_COUNT",
              "default": 4000,
              "x-techkey": "TECH.GDSII.MAX_VERTEX_COUNT"
            }
          }
        }
      }
    },
    "display": {
      "description": "Display style configuration",
      "type": "object",
      "properties": {
        "lpps": {
          "description": "Display styles for individual layers.",
          "type": "array",
          "items": {
            "type": "object",
            "title": "LppDisplay",
            "properties": {
              "lpp": {
                "$ref": "#/$defs/lppAsStringOrStringTuple",
                "description": "The lpp for which the display style is defined."
              },
              "color": {
                "$ref": "#/$defs/colorAsStringOrIntTriplet",
                "description": "The fill color"
              },
              "alpha": {
                "type": "number",
                "description": "The opacity, from 0.0 to 1.0.",
                "minimum": 0,
                "maximum": 1
              },
              "pattern": {
                "anyOf": [
                  {
                    "enum": [
                      "no-stipple",
                      "dots",
                      "dots-sparse",
                      "lines-horizontal",
                      "lines-horizontal-dense",
                      "lines-horizontal-bold",
                      "filled",
                      "lines-vertical",
                      "lines-vertical-dense",
                      "lines-vertical-bold",
                      "lines-diagonal-left",
                      "lines-diagonal-right",
                      "triangle",
                      "solid",
                      "hollow",
                      "dotted",
                      "coarsly-dotted",
                      "left-hatched",
                      "lightly-left-hatched",
                      "strongly-left-hatched-dense",
                      "strongly-left-hatched-sparse",
                      "right-hatched",
                      "lightly-right-hatched",
                      "strongly-right-hatched-dense",
                      "strongly-right-hatched-sparse",
                      "cross-hatched",
                      "lightly-cross-hatched",
                      "checkerboard-2px",
                      "strongly-cross-hatched-sparse",
                      "heavy-checkerboard",
                      "hollow-bubbles",
                      "solid-bubbles",
                      "pyramids",
                      "turned-pyramids",
                      "plus",
                      "minus",
                      "220-5-degree-down",
                      "220-5-degree-up",
                      "670-5-degree-down",
                      "670-5-degree-up",
                      "220-5-cross-hatched",
                      "zig-zag",
                      "sine",
                      "special-pattern-for-light-heavy-dithering",
                      "special-pattern-for-light-frame-dithering",
                      "vertical-dense",
                      "vertical",
                      "vertical-thick",
                      "vertical-sparse",
                      "vertical-sparse-thick",
                      "horizontal-dense",
                      "horizontal",
                      "horizontal-thick",
                      "horizontal-sparse",
                      "horizontal-sparse-thick",
                      "grid-dense",
                      "grid",
                      "grid-thick",
                      "grid-sparse",
                      "grid-sparse-thick"
                    ]
                  },
                  {
                    "type": "string"
                  }
                ],
                "description": "The fill pattern for the lpp. Either a pattern name, or one of the custom patterns"
              },
              "edge_width": {
                "type": "number",
                "minimum": 0,
                "description": "The width of the layer's edge."
              },
              "edge_color": {
                "$ref": "#/$defs/colorAsStringOrIntTriplet",
                "description": "The edge color"
              }
            },
            "required": [
              "lpp",
              "color"
            ]
          }
        },
        "custom_colors": {
          "description": "Custom color definitions.",
          "type": "object",
          "additionalProperties": {
            "oneOf": [
              {
                "type": "string",
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              {
                "type": "array",
                "items": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 255
                },
                "minItems": 3,
                "maxItems": 3
              }
            ]
          }
        },
        "custom_patterns": {
          "description": "A list of custom fill pattern definitions.",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "The name of the custom pattern."
              },
              "lines": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[.*]+$"
                },
                "minLength": 1
              }
            },
            "required": [
              "name",
              "lines"
            ]
          }
        }
      }
    },
    "settings": {
      "description": "General settings.",
      "type": "object",
      "properties": {
        "metrics": {
          "type": "object",
          "properties": {
            "unit": {
              "type": "number",
              "default": 1e-06,
              "description": "Unit of the GDSII file. default: 1e-06 technology-key: TECH.METRICS.UNIT",
              "x-techkey": "TECH.METRICS.UNIT"
            },
            "angle_step": {
              "type": "number",
              "default": 1.0,
              "description": "Angle step used for discretization of bends. default: 1.0 technology-key: TECH.METRICS.ANGLE_STEP",
              "x-techkey": "TECH.METRICS.ANGLE_STEP"
            },
            "grid": {
              "type": "number",
              "default": 1e-09,
              "description": "Discretization of the grid GDSII file. default: 1e-09 technology-key: TECH.METRICS.GRID",
              "x-techkey": "TECH.METRICS.GRID"
            }
          }
        },
        "open_access": {
          "type": "object",
          "properties": {
            "base_counter": {
              "type": "number",
              "minimum": 0,
              "default": 1000,
              "description": "Base counter for open access layers default: 1000"
            }
          }
        }
      }
    },
    "waveguides": {
      "description": "Waveguide settings.",
      "type": "object",
      "properties": {
        "default_wavelength": {
          "type": "number",
          "description": "Default wavelength used for waveguide models. technology-key: TECH.DEFAULT_WAVELENGTH",
          "x-techkey": "TECH.DEFAULT_WAVELENGTH"
        },
        "wg_bend_radius": {
          "type": "number",
          "description": "Default bend radius for waveguides. technology-key: TECH.WG.BEND_RADIUS",
          "x-techkey": "TECH.WG.BEND_RADIUS"
        },
        "wg_wire_width": {
          "type": "number",
          "description": "Default width of the core of a wire waveguide. technology-key: TECH.WG.WIRE_WIDTH",
          "x-techkey": "TECH.WG.WIRE_WIDTH"
        },
        "wg_trench_width": {
          "type": "number",
          "description": "Default width of the trench of a waveguide (from the side of the core to the end of the cladding). technology-key: TECH.WG.TRENCH_WIDTH",
          "x-techkey": "TECH.WG.TRENCH_WIDTH"
        },
        "wg_cladding_width": {
          "type": "number",
          "description": "Total width of the waveguide with cladding. Computed value: wg_wire_width + 2 * wg_trench_width technology-key: TECH.WG.CLADDING_WIDTH",
          "x-techkey": "TECH.WG.CLADDING_WIDTH"
        },
        "wg_spacing": {
          "type": "number",
          "description": "Default spacing between waveguides used in adapters. technology-key: TECH.WG.SPACING",
          "x-techkey": "TECH.WG.SPACING"
        },
        "wg_dc_spacing": {
          "type": "number",
          "description": "Default spacing for directional couplers. Computed value: wg_wire_width + 0.18 technology-key: TECH.WG.DC_SPACING",
          "x-techkey": "TECH.WG.DC_SPACING"
        },
        "wg_short_straight": {
          "type": "number",
          "description": "Default minimum length for any straight sections in a route. technology-key: TECH.WG.SHORT_STRAIGHT",
          "x-techkey": "TECH.WG.SHORT_STRAIGHT"
        },
        "wg_short_transition_length": {
          "type": "number",
          "description": "Default length of a taper. technology-key: TECH.WG.SHORT_TRANSITION_LENGTH",
          "x-techkey": "TECH.WG.SHORT_TRANSITION_LENGTH"
        },
        "wg_short_taper_length": {
          "type": "number",
          "description": "Default length of a taper. Computed value: short_transition_length technology-key: TECH.WG.SHORT_TAPER_LENGTH",
          "x-techkey": "TECH.WG.SHORT_TAPER_LENGTH"
        },
        "wg_overlap_extension": {
          "type": "number",
          "description": "Default extension of the overlap for trench waveguides. technology-key: TECH.WG.OVERLAP_EXTENSION",
          "x-techkey": "TECH.WG.OVERLAP_EXTENSION"
        },
        "wg_overlap_trench": {
          "type": "number",
          "description": "Default trench of the overlap for trench waveguides. technology-key: TECH.WG.OVERLAP_TRENCH",
          "x-techkey": "TECH.WG.OVERLAP_TRENCH"
        },
        "wg_expanded_width": {
          "type": "number",
          "description": "Default width of expanded waveguides. technology-key: TECH.WG.EXPANDED_WIDTH",
          "x-techkey": "TECH.WG.EXPANDED_WIDTH"
        },
        "wg_expanded_taper_length": {
          "type": "number",
          "description": "Default length of an extended taper for extended waveguides. technology-key: TECH.WG.EXPANDED_TAPER_LENGTH",
          "x-techkey": "TECH.WG.EXPANDED_TAPER_LENGTH"
        },
        "wg_expanded_straight": {
          "type": "number",
          "description": "Default length of an expanded straight waveguide. technology-key: TECH.WG.EXPANDED_STRAIGHT",
          "x-techkey": "TECH.WG.EXPANDED_STRAIGHT"
        },
        "wg_angle_step": {
          "type": "number",
          "description": "Angle step for bends. technology-key: TECH.WG.ANGLE_STEP",
          "x-techkey": "TECH.WG.ANGLE_STEP"
        },
        "wg_slot_width": {
          "type": "number",
          "description": "Default width of the slot for slotted waveguides. technology-key: TECH.WG.SLOT_WIDTH",
          "x-techkey": "TECH.WG.SLOT_WIDTH"
        },
        "wg_slotted_wire_width": {
          "type": "number",
          "description": "Default width of the wire for slotted waveguides. technology-key: TECH.WG.SLOTTED_WIRE_WIDTH",
          "x-techkey": "TECH.WG.SLOTTED_WIRE_WIDTH"
        },
        "wg_defaults_n_eff": {
          "type": "number",
          "description": "Default n_eff for waveguide models. technology-key: TECH.WG_DEFAULTS.N_EFF",
          "x-techkey": "TECH.WG_DEFAULTS.N_EFF"
        },
        "wg_defaults_n_group": {
          "type": "number",
          "description": "Default group index used for waveguide models. technology-key: TECH.WG_DEFAULTS.N_GROUP",
          "x-techkey": "TECH.WG_DEFAULTS.N_GROUP"
        },
        "wg_defaults_loss_db_perm": {
          "type": "number",
          "description": "Default loss per m in db used for waveguide models. technology-key: TECH.WG_DEFAULTS.LOSS_DB_PERM",
          "x-techkey": "TECH.WG_DEFAULTS.LOSS_DB_PERM"
        },
        "wg_defaults_core_layer": {
          "$ref": "#/$defs/lppAsStringOrStringTuple",
          "description": "Default core layer used in waveguides. Reference to a layer name technology-key: TECH.WG_DEFAULTS.CORE_LAYER",
          "x-techkey": "TECH.WG_DEFAULTS.CORE_LAYER"
        },
        "trace_bend_radius": {
          "type": "number",
          "description": "Default bend radius for traces, used for auto-generated bends during routing. technology-key: TECH.TRACE.BEND_RADIUS",
          "x-techkey": "TECH.TRACE.BEND_RADIUS"
        },
        "trace_control_shape_layer": {
          "$ref": "#/$defs/lppAsStringOrStringTuple",
          "description": "Reference to a layer name. This layer is used for drawing the control shape. technology-key: TECH.TRACE.CONTROL_SHAPE_LAYER",
          "x-techkey": "TECH.TRACE.CONTROL_SHAPE_LAYER"
        },
        "trace_default_layer": {
          "$ref": "#/$defs/lppAsStringOrStringTuple",
          "description": "Reference to a layer name. This layer is used as default for drawing trace shapes. technology-key: TECH.TRACE.DEFAULT_LAYER",
          "x-techkey": "TECH.TRACE.DEFAULT_LAYER"
        },
        "trace_draw_control_shape": {
          "type": "boolean",
          "default": false,
          "description": "If set to true, a control shape is drawn on top of the waveguide. This can be useful for debugging. default: False technology-key: TECH.TRACE.DRAW_CONTROL_SHAPE",
          "x-techkey": "TECH.TRACE.DRAW_CONTROL_SHAPE"
        }
      }
    },
    "picazzo": {
      "description": "Picazzo settings.",
      "type": "object",
      "properties": {
        "metal1_layer": {
          "$ref": "#/$defs/lppAsStringOrStringTuple",
          "description": "Default layer for M1 guides. technology-key: TECH.PPLAYER.M1.LINE",
          "x-techkey": "TECH.PPLAYER.M1.LINE"
        },
        "metal2_layer": {
          "$ref": "#/$defs/lppAsStringOrStringTuple",
          "description": "Default layer for M2 guides. technology-key: TECH.PPLAYER.M2.LINE",
          "x-techkey": "TECH.PPLAYER.M2.LINE"
        },
        "wg_text": {
          "$ref": "#/$defs/lppAsStringOrStringTuple",
          "description": "Default layer for text on a design. technology-key: TECH.PPLAYER.WG.TEXT",
          "x-techkey": "TECH.PPLAYER.WG.TEXT"
        },
        "via12_layer": {
          "$ref": "#/$defs/lppAsStringOrStringTuple",
          "description": "Default layer for M12 vias. technology-key: TECH.PPLAYER.V12.PILLAR",
          "x-techkey": "TECH.PPLAYER.V12.PILLAR"
        },
        "wg_process": {
          "type": "string",
          "description": "Default process for waveguides. technology-key: TECH.PROCESS.WG",
          "x-techkey": "TECH.PROCESS.WG"
        },
        "rwg_process": {
          "type": "string",
          "description": "Default process for rib waveguides. technology-key: TECH.PROCESS.RWG",
          "x-techkey": "TECH.PROCESS.RWG"
        },
        "fc_process": {
          "type": "string",
          "description": "Default process for fiber couplers. technology-key: TECH.PROCESS.FC",
          "x-techkey": "TECH.PROCESS.FC"
        },
        "sil_process": {
          "type": "string",
          "description": "Default process for modulators. technology-key: TECH.PROCESS.SIL",
          "x-techkey": "TECH.PROCESS.SIL"
        },
        "container_terminate_ports_child_suffix": {
          "type": "string",
          "default": "termination",
          "description": "Child suffix for terminated ports in containers. default: termination technology-key: TECH.CONTAINER.TERMINATE_PORTS.CHILD_SUFFIX",
          "x-techkey": "TECH.CONTAINER.TERMINATE_PORTS.CHILD_SUFFIX"
        },
        "container_terminate_ports_termination_instance_prefix": {
          "type": "string",
          "default": "termination",
          "description": "Instance prefix for terminated ports in containers. default: termination technology-key: TECH.CONTAINER.TERMINATE_PORTS.TERMINATION_INSTANCE_PREFIX",
          "x-techkey": "TECH.CONTAINER.TERMINATE_PORTS.TERMINATION_INSTANCE_PREFIX"
        },
        "io_adapter": {
          "type": "object",
          "properties": {
            "iofibcoup_connect_transition_length": {
              "type": [
                "number",
                "null"
              ],
              "default": null,
              "description": "Connection transition length for I/O fiber couplers. technology-key: TECH.IO.ADAPTER.IOFIBCOUP.CONNECT_TRANSITION_LENGTH",
              "x-techkey": "TECH.IO.ADAPTER.IOFIBCOUP.CONNECT_TRANSITION_LENGTH"
            },
            "iofibcoup_fanout_length": {
              "type": "number",
              "description": "Fanout length for I/O fiber couplers. technology-key: TECH.IO.ADAPTER.IOFIBCOUP.FANOUT_LENGTH",
              "x-techkey": "TECH.IO.ADAPTER.IOFIBCOUP.FANOUT_LENGTH"
            },
            "iofibcoup_fiber_coupler_transition_length": {
              "type": [
                "number",
                "null"
              ],
              "default": null,
              "description": "Fiber coupler transition length for I/O fiber couplers. technology-key: TECH.IO.ADAPTER.IOFIBCOUP.FIBER_COUPLER_TRANSITION_LENGTH",
              "x-techkey": "TECH.IO.ADAPTER.IOFIBCOUP.FIBER_COUPLER_TRANSITION_LENGTH"
            },
            "iofibcoup_s_bend_angle": {
              "type": "number",
              "description": "S-bend angle for I/O fiber couplers. technology-key: TECH.IO.ADAPTER.IOFIBCOUP.S_BEND_ANGLE",
              "x-techkey": "TECH.IO.ADAPTER.IOFIBCOUP.S_BEND_ANGLE"
            }
          }
        },
        "io_fibcoup": {
          "type": "object",
          "properties": {
            "curved_socket_margin_from_grating": {
              "type": "number",
              "description": "Margin from grating for curved fiber coupler sockets. Default is TECH.WG.SHORT_STRAIGHT technology-key: TECH.IO.FIBCOUP.CURVED.SOCKET.MARGIN_FROM_GRATING",
              "x-techkey": "TECH.IO.FIBCOUP.CURVED.SOCKET.MARGIN_FROM_GRATING"
            },
            "curved_grating_angle_span": {
              "type": "number",
              "description": "Angle span for curved fiber coupler gratings. technology-key: TECH.IO.FIBCOUP.CURVED.GRATING.ANGLE_SPAN",
              "x-techkey": "TECH.IO.FIBCOUP.CURVED.GRATING.ANGLE_SPAN"
            },
            "curved_grating_box_width": {
              "type": "number",
              "description": "Box width for curved fiber coupler gratings. technology-key: TECH.IO.FIBCOUP.CURVED.GRATING.BOX_WIDTH",
              "x-techkey": "TECH.IO.FIBCOUP.CURVED.GRATING.BOX_WIDTH"
            },
            "curved_grating_focal_distance": {
              "type": "number",
              "description": "Focal distance for curved fiber coupler gratings. Default is 20 * TECH.IO.FIBCOUP.CURVED.GRATING.PERIOD technology-key: TECH.IO.FIBCOUP.CURVED.GRATING.FOCAL_DISTANCE",
              "x-techkey": "TECH.IO.FIBCOUP.CURVED.GRATING.FOCAL_DISTANCE"
            },
            "curved_grating_n_o_lines": {
              "type": "integer",
              "description": "Number of lines for curved fiber coupler gratings. Default is floor(TECH.IO.FIBCOUP.CURVED.GRATING.BOX_WIDTH / TECH.IO.FIBCOUP.CURVED.GRATING.PERIOD) technology-key: TECH.IO.FIBCOUP.CURVED.GRATING.N_O_LINES",
              "x-techkey": "TECH.IO.FIBCOUP.CURVED.GRATING.N_O_LINES"
            },
            "curved_grating_period": {
              "type": "number",
              "description": "Period for curved fiber coupler gratings. technology-key: TECH.IO.FIBCOUP.CURVED.GRATING.PERIOD",
              "x-techkey": "TECH.IO.FIBCOUP.CURVED.GRATING.PERIOD"
            },
            "curved_grating_start_radius": {
              "type": "number",
              "description": "Start radius for curved fiber coupler gratings. Default is TECH.IO.FIBCOUP.CURVED.GRATING.FOCAL_DISTANCE - TECH.IO.FIBCOUP.CURVED.GRATING.BOX_WIDTH / 2.0 technology-key: TECH.IO.FIBCOUP.CURVED.GRATING.START_RADIUS",
              "x-techkey": "TECH.IO.FIBCOUP.CURVED.GRATING.START_RADIUS"
            },
            "curved_socket_length": {
              "type": "number",
              "description": "Socket length for curved fiber couplers. technology-key: TECH.IO.FIBCOUP.CURVED.SOCKET.LENGTH",
              "x-techkey": "TECH.IO.FIBCOUP.CURVED.SOCKET.LENGTH"
            },
            "curved_socket_straight_extension": {
              "type": "array",
              "items": {
                "type": "number"
              },
              "description": "Straight extension for curved fiber coupler sockets. technology-key: TECH.IO.FIBCOUP.CURVED.SOCKET.STRAIGHT_EXTENSION",
              "x-techkey": "TECH.IO.FIBCOUP.CURVED.SOCKET.STRAIGHT_EXTENSION"
            },
            "default_socket_length": {
              "type": "number",
              "description": "Socket length for default fiber couplers. No default found."
            },
            "straight_grating_box_width": {
              "type": "number",
              "description": "Box width for straight fiber coupler gratings. technology-key: TECH.IO.FIBCOUP.STRAIGHT.GRATING.BOX_WIDTH",
              "x-techkey": "TECH.IO.FIBCOUP.STRAIGHT.GRATING.BOX_WIDTH"
            },
            "straight_grating_line_width": {
              "type": "number",
              "description": "Line width for straight fiber coupler gratings. technology-key: TECH.IO.FIBCOUP.STRAIGHT.GRATING.LINE_WIDTH",
              "x-techkey": "TECH.IO.FIBCOUP.STRAIGHT.GRATING.LINE_WIDTH"
            },
            "straight_grating_n_o_lines": {
              "type": "integer",
              "description": "Number of lines for straight fiber coupler gratings. technology-key: TECH.IO.FIBCOUP.STRAIGHT.GRATING.N_O_LINES",
              "x-techkey": "TECH.IO.FIBCOUP.STRAIGHT.GRATING.N_O_LINES"
            },
            "straight_grating_period": {
              "type": "number",
              "description": "Period for straight fiber coupler gratings. technology-key: TECH.IO.FIBCOUP.STRAIGHT.GRATING.PERIOD",
              "x-techkey": "TECH.IO.FIBCOUP.STRAIGHT.GRATING.PERIOD"
            },
            "straight_socket_length": {
              "type": "number",
              "description": "Socket length for straight fiber couplers. technology-key: TECH.IO.FIBCOUP.STRAIGHT.SOCKET.LENGTH",
              "x-techkey": "TECH.IO.FIBCOUP.STRAIGHT.SOCKET.LENGTH"
            }
          }
        },
        "modulators": {
          "type": "object",
          "properties": {
            "phaseshifter_latpn_bridge_pitch": {
              "type": "number",
              "description": "Bridge pitch for lateral PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.LATPN.BRIDGE_PITCH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.LATPN.BRIDGE_PITCH"
            },
            "phaseshifter_latpn_bridge_width": {
              "type": "number",
              "description": "Bridge width for lateral PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.LATPN.BRIDGE_WIDTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.LATPN.BRIDGE_WIDTH"
            },
            "phaseshifter_latpn_junction_offset": {
              "type": "number",
              "description": "Junction offset for lateral PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.LATPN.JUNCTION_OFFSET",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.LATPN.JUNCTION_OFFSET"
            },
            "phaseshifter_longpn_n_length": {
              "type": "number",
              "description": "N-region length for longitudinal PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.LONGPN.N_LENGTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.LONGPN.N_LENGTH"
            },
            "phaseshifter_longpn_n_width": {
              "type": "number",
              "description": "N-region width for longitudinal PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.LONGPN.N_WIDTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.LONGPN.N_WIDTH"
            },
            "phaseshifter_longpn_p_length": {
              "type": "number",
              "description": "P-region length for longitudinal PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.LONGPN.P_LENGTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.LONGPN.P_LENGTH"
            },
            "phaseshifter_longpn_p_width": {
              "type": "number",
              "description": "P-region width for longitudinal PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.LONGPN.P_WIDTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.LONGPN.P_WIDTH"
            },
            "phaseshifter_pn_junction_overlap": {
              "type": "number",
              "description": "Junction overlap for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.JUNCTION_OVERLAP",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.JUNCTION_OVERLAP"
            },
            "phaseshifter_pn_nplus_extension": {
              "type": "number",
              "description": "N+ extension for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.NPLUS_EXTENSION",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.NPLUS_EXTENSION"
            },
            "phaseshifter_pn_nplus_offset": {
              "type": "number",
              "description": "N+ offset for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.NPLUS_OFFSET",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.NPLUS_OFFSET"
            },
            "phaseshifter_pn_nplus_width": {
              "type": "number",
              "description": "N+ width for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.NPLUS_WIDTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.NPLUS_WIDTH"
            },
            "phaseshifter_pn_n_cont_offsets": {
              "type": "array",
              "items": {
                "type": "number"
              },
              "description": "N-contact offsets for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.N_CONT_OFFSETS",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.N_CONT_OFFSETS"
            },
            "phaseshiftern_pn_n_cont_pitch": {
              "type": "number",
              "description": "N-contact pitch for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.N_CONT_PITCH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.N_CONT_PITCH"
            },
            "phaseshifter_pn_n_metal1_offset": {
              "type": "number",
              "description": "N-metal1 offset for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.N_METAL1_OFFSET",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.N_METAL1_OFFSET"
            },
            "phaseshifter_pn_n_metal1_width": {
              "type": "number",
              "description": "N-metal1 width for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.N_METAL1_WIDTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.N_METAL1_WIDTH"
            },
            "phaseshifter_pn_n_sil_extension": {
              "type": "number",
              "description": "N-silicide extension for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.N_SIL_EXTENSION",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.N_SIL_EXTENSION"
            },
            "phaseshifter_pn_n_sil_offset": {
              "type": "number",
              "description": "N-silicide offset for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.N_SIL_OFFSET",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.N_SIL_OFFSET"
            },
            "phaseshifter_pn_n_sil_width": {
              "type": "number",
              "description": "N-silicide width for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.N_SIL_WIDTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.N_SIL_WIDTH"
            },
            "phaseshifter_pn_n_width": {
              "type": "number",
              "description": "N-width for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.N_WIDTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.N_WIDTH"
            },
            "phaseshifter_pn_pplus_extension": {
              "type": "number",
              "description": "P+ extension for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.PPLUS_EXTENSION",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.PPLUS_EXTENSION"
            },
            "phaseshifter_pn_pplus_offset": {
              "type": "number",
              "description": "P+ offset for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.PPLUS_OFFSET",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.PPLUS_OFFSET"
            },
            "phaseshifter_pn_pplus_width": {
              "type": "number",
              "description": "P+ width for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.PPLUS_WIDTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.PPLUS_WIDTH"
            },
            "phaseshifter_pn_p_cont_offsets": {
              "type": "array",
              "items": {
                "type": "number"
              },
              "description": "P-contact offsets for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.P_CONT_OFFSETS",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.P_CONT_OFFSETS"
            },
            "phaseshifter_pn_p_cont_pitch": {
              "type": "number",
              "description": "P-contact pitch for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.P_CONT_PITCH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.P_CONT_PITCH"
            },
            "phaseshifter_pn_p_metal1_offset": {
              "type": "number",
              "description": "P-metal1 offset for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.P_METAL1_OFFSET",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.P_METAL1_OFFSET"
            },
            "phaseshifter_pn_p_metal1_width": {
              "type": "number",
              "description": "P-metal1 width for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.P_METAL1_WIDTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.P_METAL1_WIDTH"
            },
            "phaseshifter_pn_p_sil_extension": {
              "type": "number",
              "description": "P-silicide extension for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.P_SIL_EXTENSION",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.P_SIL_EXTENSION"
            },
            "phaseshifter_pn_p_sil_offset": {
              "type": "number",
              "description": "P-silicide offset for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.P_SIL_OFFSET",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.P_SIL_OFFSET"
            },
            "phaseshifter_pn_p_sil_width": {
              "type": "number",
              "description": "P-silicide width for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.P_SIL_WIDTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.P_SIL_WIDTH"
            },
            "phaseshifter_pn_p_width": {
              "type": "number",
              "description": "P-width for PN phase shifters. technology-key: TECH.MODULATORS.PHASESHIFTER.PN.P_WIDTH",
              "x-techkey": "TECH.MODULATORS.PHASESHIFTER.PN.P_WIDTH"
            }
          }
        }
      }
    },
    "ports": {
      "description": "Settings related to ports",
      "type": "object",
      "properties": {
        "default_length": {
          "type": "number",
          "description": "Default length used for ports. technology-key: TECH.PORT.DEFAULT_LENGTH",
          "x-techkey": "TECH.PORT.DEFAULT_LENGTH"
        },
        "default_layer": {
          "$ref": "#/$defs/lppAsStringOrStringTuple",
          "description": "Default layer used for ports. technology-key: TECH.PORT.DEFAULT_LAYER",
          "x-techkey": "TECH.PORT.DEFAULT_LAYER"
        }
      }
    },
    "blocks": {
      "description": "IOColumn settings",
      "type": "object",
      "properties": {
        "default_yspacing": {
          "type": "number",
          "description": "Default spacing between blocks. technology-key: TECH.BLOCKS.DEFAULT_YSPACING",
          "x-techkey": "TECH.BLOCKS.DEFAULT_YSPACING"
        },
        "default_width": {
          "type": "number",
          "description": "Default width of blocks. technology-key: TECH.BLOCKS.DEFAULT_WIDTH",
          "x-techkey": "TECH.BLOCKS.DEFAULT_WIDTH"
        }
      }
    }
  }
}
