weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
# Weir Corpus Seed Format

This document describes the binary formats used by the seed files in `tests/corpus/seeds/`.

All multi-byte values are stored in **little-endian** byte order. Arrays of `u32` are stored as contiguous 4-byte words.

---

## CSR Graph Seeds (`csr_*.bin`)

A raw CSR (Compressed Sparse Row) graph with edge-kind masks.

```
[u32 node_count]
[u32 edge_count]
[u32 offsets_len]      // = node_count + 1
[u32[] edge_offsets]   // length = offsets_len
[u32[] edge_targets]   // length = edge_count
[u32[] edge_masks]     // length = edge_count
```

**Validation:**
- `offsets_len == node_count + 1`
- `edge_offsets[0] == 0`
- `edge_offsets` is monotonically non-decreasing
- `edge_count == edge_offsets[offsets_len - 1]`
- All `edge_targets[i] < node_count`
- `edge_masks.len() == edge_count`

---

## IFDS Problem Seeds (`ifds_*.bin`)

A flattened exploded-supergraph representation for IFDS/IDE problems.

```
[u32 node_count]       // total nodes in exploded graph
[u32 edge_count]
[u32 seed_count]
[u32 summary_count]
[u32[] edge_offsets]   // CSR offsets, length = node_count + 1
[u32[] edge_targets]   // CSR targets, length = edge_count
[u32[] seed_nodes]     // length = seed_count
[u32[] summary_pairs]  // length = 2 * summary_count, [src0, dst0, src1, dst1, ...]
```

---

## Dominator CFG Seeds (`dom_*.bin`)

A control-flow graph with a designated entry node.

```
[u32 node_count]
[u32 edge_count]
[u32 entry_node]
[u32[] edge_offsets]   // length = node_count + 1
[u32[] edge_targets]   // length = edge_count
```

**Validation:**
- `entry_node < node_count` (unless `node_count == 0`)
- Standard CSR invariants apply

---

## Cross-Analysis Composed Seeds (`cross_*.bin`)

A single input containing a CFG plus pre-computed expected outputs for three analyses.

```
[u32 node_count]
[u32 edge_count]
[u32 entry_node]
[u32 seed_count]
[u32[] edge_offsets]   // length = node_count + 1
[u32[] edge_targets]   // length = edge_count
[u32[] edge_masks]     // length = edge_count
[u32[] seed_nodes]     // length = seed_count
[u32[] dom_output]     // length = node_count * bitset_words(node_count)
[u32[] reaching_output]// length = bitset_words(node_count)
[u32[] ifds_output]    // length = bitset_words(node_count)
```

Where `bitset_words(n) = ceil(n / 32)`.

**Output semantics:**
- `dom_output`: Row-major dominator matrix. Row `i` is a bitset where bit `j` is set iff node `j` dominates node `i`.
- `reaching_output`: Bitset of nodes reachable from `entry_node` traversing only `CONTROL` edges.
- `ifds_output`: Bitset of nodes reachable from `seed_nodes` traversing edges whose mask intersects `IFDS_REACH_MASK`.

---

## Adversarial Seeds (`adversarial_*.bin`)

Adversarial seeds reuse the same formats as above but contain intentionally malformed or extreme values:

- **CSR adversarial:** mismatched lengths, non-monotonic offsets, out-of-range targets, zero-node count with non-empty arrays.
- **IFDS adversarial:** `u32::MAX` dimensions, seed counts exceeding node counts, out-of-range summary pairs.
- **DOM adversarial:** entry nodes out of range, non-monotonic offsets, disconnected targets.
- **Cross adversarial:** single-node self-loops, empty graphs, disconnected components with hand-computed outputs.

These seeds are useful for testing parser robustness and validation logic.