Skip to content

ogs.dsl.compile

Compile a DSL Pattern into PatternIR.

Source code in packages/gds-games/ogs/dsl/compile.py
def compile_to_ir(pattern: Pattern) -> PatternIR:
    """Compile a DSL Pattern into PatternIR."""
    # 1. Flatten games (GDS stage 1)
    game_irs = flatten_blocks(pattern.game, _compile_game)

    # 2. Extract flows (GDS stage 2 with OGS emitter)
    flows: list[FlowIR] = extract_wirings(pattern.game, _ogs_wiring_emitter)

    # 3. Map inputs and generate input flows
    input_irs = []
    for inp in pattern.inputs:
        input_irs.append(
            InputIR(
                name=inp.name,
                input_type=inp.input_type,
                schema_hint=inp.schema_hint,
            )
        )
        if inp.target_game:
            flows.append(
                FlowIR(
                    source=inp.name,
                    target=inp.target_game,
                    label=inp.flow_label or inp.name,
                    flow_type=FlowType.OBSERVATION,
                    direction=FlowDirection.COVARIANT,
                )
            )

    # 4. Extract composition hierarchy (OGS-specific for CORECURSIVE)
    counter = [0]
    hierarchy = _extract_hierarchy(pattern.game, counter)
    hierarchy = _flatten_sequential_chains(hierarchy)

    return PatternIR(
        name=pattern.name,
        games=game_irs,
        flows=flows,
        inputs=input_irs,
        composition_type=pattern.composition_type,
        terminal_conditions=pattern.terminal_conditions,
        action_spaces=pattern.action_spaces,
        initialization=pattern.initializations,
        hierarchy=hierarchy,
        source_canvas=pattern.source,
    )