Compile a ValueStreamModel into a GDSSpec.
Registers: types, spaces, entities, blocks, wirings.
Source code in packages/gds-business/gds_business/vsm/compile.py
| def compile_vsm(model: ValueStreamModel) -> GDSSpec:
"""Compile a ValueStreamModel into a GDSSpec.
Registers: types, spaces, entities, blocks, wirings.
"""
spec = GDSSpec(name=model.name, description=model.description)
# 1. Register types
spec.collect(MaterialType, ProcessSignalType)
# 2. Register spaces
spec.collect(MaterialSpace, ProcessSignalSpace)
# 3. Register entities (one per buffer)
for buf in model.buffers:
spec.register_entity(_build_buffer_entity(buf))
# 4. Register blocks
for s in model.suppliers:
spec.register_block(_build_supplier_block(s))
for c in model.customers:
spec.register_block(_build_customer_block(c))
for step in model.steps:
spec.register_block(_build_step_block(step, model))
for buf in model.buffers:
spec.register_block(_build_buffer_mechanism(buf, model))
# 5. Register spec wirings
all_block_names = [b.name for b in spec.blocks.values()]
wires: list[Wire] = []
for flow in model.material_flows:
source = flow.source
target = flow.target
if source in model.buffer_names:
source = _buffer_block_name(source)
if target in model.buffer_names:
target = _buffer_block_name(target)
wires.append(Wire(source=source, target=target, space="VSM MaterialSpace"))
for flow in model.information_flows:
source = flow.source
target = flow.target
if source in model.buffer_names:
source = _buffer_block_name(source)
if target in model.buffer_names:
target = _buffer_block_name(target)
wires.append(Wire(source=source, target=target, space="VSM ProcessSignalSpace"))
if wires:
spec.register_wiring(
SpecWiring(
name=f"{model.name} Wiring",
block_names=all_block_names,
wires=wires,
description=f"Auto-generated wiring for VSM {model.name!r}",
)
)
return spec
|