Skip to main content

Connections

Connections define how signals flow between ports, instances, and constants.

Connect Block

All connections must be inside a connect block:

connect {
# Connection statements here
}

A component must have exactly one connect block.

Connection Syntax

<source> -> <destination>;

The arrow -> indicates signal flow from source to destination.

Valid Sources

  • Component input ports
  • Instance output ports
  • Constants
  • Bit-indexed or sliced versions of the above

Valid Destinations

  • Component output ports
  • Instance input ports
  • Bit-indexed or sliced versions of the above

Connection Patterns

Input to Instance

A -> gate1.A;
B -> gate1.B;

Instance to Instance

gate1.O -> gate2.A;
xor1.O -> and1.B;

Instance to Output

gate2.O -> Result;
adder.Sum -> Sum;

Bit-indexed Connections

DataBus[1] -> gate.A;      # Single bit
DataBus[8] -> gate.B;
gate.O -> Result[1];

Slice Connections

Input[:4] -> LowNibble;    # Bits 1-4
Input[5:8] -> HighNibble; # Bits 5-8

Constant to Instance

MASK[1] -> and1.A;
Zero[{i}] -> gate{i}.B;

Complete Example

component HalfAdder(A, B) -> (Sum, Carry) {
xor1: XOR;
and1: AND;

connect {
A -> xor1.A;
B -> xor1.B;
A -> and1.A;
B -> and1.B;
xor1.O -> Sum;
and1.O -> Carry;
}
}

Connection Rules

Single Driver Rule

Each input can only be driven by one source. This is invalid:

# ERROR: Two sources driving the same input
A -> gate1.A;
B -> gate1.A; # Error!

Multiple Destinations

A single source can drive multiple destinations:

A -> gate1.A;
A -> gate2.A; # OK - A drives both gates
A -> and1.B; # OK - fan-out is allowed

Connection Order

The order of connections in the connect block does not affect behavior. Connections are evaluated concurrently, just like real hardware.

connect {
# These are equivalent orderings:
A -> xor1.A;
B -> xor1.B;
xor1.O -> Sum;

# Same as:
xor1.O -> Sum;
B -> xor1.B;
A -> xor1.A;
}