示例#1
0
def netlist_to_component(
        instances: Dict[str, Tuple[Component, str]],
        connections: List[Tuple[str, str, str, str]],
        ports_map: Dict[str, Tuple[str, str]] = None,
        position: Tuple[float, float] = (0.0, 0.0),
) -> Component:
    """ Netlist_to_component is deprecated! use pp.componet_from_yaml instead
    Returns a component from a netlist (instances, connections and ports map)

    Args:
        instances:
            list of (instance_id <str>, component <Component>, transform <tuple>)

        connections:
            list of (component_id1, port_name1, component_id2, port_name2)
            Has to be ordered such that any component refered to in the connections
            has already been placed (except for the first component)

        ports_map:
            {port_name: (instance_id, port_name)}

    Returns: component with netlist stored in component.netlist

    ```

    [
        {
            "name": "CP2x2",
            "rank": 0,
            "ports": ["in1", "in2", "out1", "out2"],
            "type": "CPBIDIR",
            "settings": {"R": 0.5},
        },
        {
            "name": "WG_CAVITY",
            "rank": 0,
            "ports": ["in", "out"],
            "type": "WG",
            "settings": {"length": 50, "loss_dB_m": 60000, "width": 0.5},
        },
        {
            "name": "ring_resonator",
            "rank": 1,
            "type": "COMPOUND",
            "settings": {},
            "instances": [
                "CP1, CP2x2, None, None, 0.0, 0.0",
                "WG1, WG_CAVITY, None, None, 0.0, 0.0",
            ],
            "connections": ["CP1, out1, WG1, in", "WG1, out, CP1, in1"],
            "ports": {"in1": "CP1, in2", "out1": "CP1, out2"},
        },
    ]
    ```

    mirror, rotation, x, y
    """

    if len(connections) == 0:
        raise ValueError("no connections defined")

    instance_id, port, _, _ = connections[0]
    assert instance_id in instances, f"{instance_id} not in {list(instances.keys())}"
    component, transform_name = instances[instance_id]

    # First component reference
    sref_start = gen_sref(component, transform_name, port, position)
    cmp_name_to_sref = {instance_id: sref_start}

    # Iterate over all connections: create and place instances
    for cmp1_name, port1, cmp2_name, port2 in connections:
        if cmp1_name not in cmp_name_to_sref:
            cmp1_name, port1, cmp2_name, port2 = cmp2_name, port2, cmp1_name, port1

        if cmp2_name not in cmp_name_to_sref:
            component, transform_name = instances[cmp2_name]

            _ref = cmp_name_to_sref[cmp1_name]
            try:
                position = _ref.ports[port1].midpoint
            except Exception:
                print("{} has not port {}".format(cmp1_name, port1))

            sref = gen_sref(component, transform_name, port2, position)

            cmp_name_to_sref[cmp2_name] = sref

    c = Component()
    c.add(list(cmp_name_to_sref.values()))

    if ports_map:
        for port_name, (cmp_id, internal_port_name) in ports_map.items():
            component_ref = cmp_name_to_sref[cmp_id]
            component = component_ref.parent
            assert internal_port_name in component.ports, (
                f"{internal_port_name} not in {component_ref.ports.keys()} for"
                f" {component}")
            port = component_ref.ports[internal_port_name]
            c.add_port(port_name, port=port)
            ports_map = {k: ", ".join(v) for k, v in ports_map.items()}

    # Set aliases
    for cmp_id, ref in cmp_name_to_sref.items():
        c[cmp_id] = ref

    c.netlist = cmp_name_to_sref

    # add leaf cells to netlist
    netlist = []
    for name, (component, _) in instances.items():
        netlist.append(
            dict(
                name=name,
                rank=0,
                ports=list(component.ports.keys()),
                settings=component.settings,
            ))
    # add the compound cell to the netlist
    netlist.append(
        dict(
            name="component_name",
            rank=1,
            type="COMPOUND",
            settings={},
            connections=[", ".join(i) for i in connections],
            ports=ports_map,
        ))
    c.netlist = netlist
    return c
示例#2
0
def netlist_to_component(components, connections, ports_map, position=(0, 0)):
    """
    Args:
        components:
            list of (component_id <str>, component <Component>, transform <tuple>)

        connections:
            list of (component_id1, port_name1, component_id2, port_name2)
            Has to be ordered such that any component refered to in the connections
            has already been placed (except for the first component)

        ports_map:
            {port_name: (component_id, port_name)}

    Returns: component
    the component has component.netlist

    [
        {
            "name": "CP2x2",
            "rank": 0,
            "ports": ["in1", "in2", "out1", "out2"],
            "type": "CPBIDIR",
            "settings": {"R": 0.5},
        },
        {
            "name": "WG_CAVITY",
            "rank": 0,
            "ports": ["in", "out"],
            "type": "WG",
            "settings": {"length": 50, "loss_dB_m": 60000, "width": 0.5},
        },
        {
            "name": "ring_resonator",
            "rank": 1,
            "type": "COMPOUND",
            "settings": {},
            "components": [
                "CP1, CP2x2, None, None, 0.0, 0.0",
                "WG1, WG_CAVITY, None, None, 0.0, 0.0",
            ],
            "connections": ["CP1, out1, WG1, in", "WG1, out, CP1, in1"],
            "ports": {"in1": "CP1, in2", "out1": "CP1, out2"},
        },
    ]

    mirror, rotation, x, y
    """
    if len(connections) == 0:
        raise ValueError("Error number of connections", len(connections),
                         len(components))

    component_id, cmp_port, _, _ = connections[0]

    component, transform_name = components[component_id]

    # First component reference
    sref_start = gen_sref(component, transform_name, cmp_port, position)
    cmp_name_to_sref = {component_id: sref_start}

    # Iterate over all connections: create and place components
    for cmp1_name, port1, cmp2_name, port2 in connections:
        if cmp1_name not in cmp_name_to_sref:
            cmp1_name, port1, cmp2_name, port2 = cmp2_name, port2, cmp1_name, port1

        if cmp2_name not in cmp_name_to_sref:
            component, transform_name = components[cmp2_name]

            _ref = cmp_name_to_sref[cmp1_name]
            try:
                position = _ref.ports[port1].midpoint
            except:
                print("{} has not port {}".format(cmp1_name, port1))

            sref = gen_sref(component, transform_name, port2, position)

            cmp_name_to_sref[cmp2_name] = sref

    c = Component()
    c.add(list(cmp_name_to_sref.values()))
    for port_name, (cmp_id, internal_port_name) in ports_map.items():
        c.add_port(port_name,
                   port=cmp_name_to_sref[cmp_id].ports[internal_port_name])

    # Set aliases
    for cmp_id, ref in cmp_name_to_sref.items():
        c[cmp_id] = ref

    c.info["components"] = cmp_name_to_sref
    # c.components = components
    # c.connections = connections
    # c.ports_map = ports_map
    # c.cells = {
    #     cname: c for cname, (c, transf) in components.items()
    # }  # "CP1": (cpl, "None"),

    # add leaf cells to netlist
    netlist = []
    for name, (component, _) in components.items():
        netlist.append(
            dict(
                name=name,
                rank=0,
                ports=list(component.ports.keys()),
                settings=component.settings,
            ))
    # add the compound cell to the netlist
    netlist.append(
        dict(
            name="component_name",
            rank=1,
            type="COMPOUND",
            settings={},
            connections=[", ".join(i) for i in connections],
            ports={k: ", ".join(v)
                   for k, v in ports_map.items()},
        ))
    c.netlist = netlist
    return c