Skip to content

gds_software.erd.compile

Compiler: ERDModel -> GDSSpec / SystemIR.

Public Functions

Compile an ERDModel into a GDSSpec.

Source code in packages/gds-software/gds_software/erd/compile.py
def compile_erd(model: ERDModel) -> GDSSpec:
    """Compile an ERDModel into a GDSSpec."""
    spec = GDSSpec(name=model.name, description=model.description)

    # 1. Register types
    spec.collect(ERDAttributeType)

    # 2. Register spaces
    spec.collect(ERDAttributeSpace)

    # 3. Register entities
    for entity in model.entities:
        spec.register_entity(_build_erd_entity(entity))

    # 4. Register blocks
    for rel in model.relationships:
        spec.register_block(_build_relationship_mechanism(rel, model))

    # If no relationships, create identity mechanism
    if not model.relationships:
        entity = model.entities[0]
        spec.register_block(
            Mechanism(
                name=f"{entity.name} Identity",
                interface=Interface(
                    forward_out=(port(_entity_port_name(entity.name)),),
                ),
                updates=[(entity.name, "id")],
            )
        )

    # 5. Register spec wirings
    all_block_names = [b.name for b in spec.blocks.values()]
    wires: list[Wire] = []

    for rel in model.relationships:
        wires.append(
            Wire(
                source=_rel_block_name(rel.name),
                target=_rel_block_name(rel.name),
                space="ERD AttributeSpace",
            )
        )

    spec.register_wiring(
        SpecWiring(
            name=f"{model.name} Wiring",
            block_names=all_block_names,
            wires=wires,
            description=f"Auto-generated wiring for ERD {model.name!r}",
        )
    )

    return spec

Compile an ERDModel directly to SystemIR.

Source code in packages/gds-software/gds_software/erd/compile.py
def compile_erd_to_system(model: ERDModel) -> SystemIR:
    """Compile an ERDModel directly to SystemIR."""
    root = _build_composition_tree(model)
    return compile_system(model.name, root)