Issue 163906
Summary Request Commit Access For wky17
Labels infra:commit-access-request
Assignees
Reporter wky17
    ### Why Are you requesting commit access ?

InferWidths Pass Fails on Solvable Width Constraints with Circular Dependencies.

The current `InferWidths` pass in firtool(1.109.0) exhibits two critical flaws:

1. **Incorrect handling of circular dependencies**:  

The pass erroneously throws uninferrable exceptions for solvable constraints with circular dependencies, despite the existence of a least solution.
**Demonstrative Example**:

```firrtl
FIRRTL version 3.0.0
circuit A:
  module A:
    input in : UInt<4>
    input clock : Clock
    output out : UInt
    reg x : UInt, clock
    connect x, add(tail(x,1), in)  // Constraint: wₓ ≥ max(wₓ-1, 4) + 1
    connect out, x
```

**Expected Solution**: wₓ = 5
**Observed Failure**:

```Terminal
error: 'firrtl.reg' op is constrained to be wider than itself
    reg x : UInt, clock
    ^
7:5: note: see current operation: %0 = "firrtl.reg"(%arg1) <{annotations = [], name = "x", nameKind = #firrtl<name_kind droppable_name>}> : (!firrtl.clock) -> !firrtl.uint
8:14: note: constrained width W >= W+1 here:
    x <= add(tail(x,1), in)
             ^
8:7: note: constrained width W >= W+1 here:
    x <= add(tail(x,1), in)
      ^
```

2. **Completeness Deficiencies in Constraint Resolution**: 

Source code analysis reveals fundamental incompleteness. The implementation fails to identify valid least solutions for constraint systems where such solutions provably exist and even throws unexpected reports.

**Demonstrative Example**:

```firrtl
FIRRTL version 3.0.0
circuit Foo:
  module Foo:
    input in : UInt<4>
    input clock : Clock
    output out : UInt

    reg x1 : UInt, clock
    wire x2 : UInt
    wire x3 : UInt

    connect x1, mul(mul(x2, in), x2)  // Constraint: wₓ₁ ≥ 2wₓ₂ + 4
    connect x3, shr(x1,2)             // Constraint: wₓ₃ ≥ max(wₓ₁ - 2, 0)
    connect x2, tail(x3,2)            // Constraint: wₓ₂ ≥ wₓ₃ - 2
    connect out, x1
```

**Expected Solution**: wₓ₁ = 4, wₓ₂ = 0, wₓ₃ = 2
**Observed Failure** (seems nonsense):

```
error: 'firrtl.reg' op is constrained to be wider than itself
    reg x1 : UInt, clock
    ^
...
12:21: note: constrained width W >= 2W+4 here:
    connect x1, mul(mul(x2, in), x2)
                ^
14:17: note: constrained width W >= 2W here:
    connect x2, tail(x3,2)
                ^
```

The erroneous "constrained to be wider than itself" diagnostic indicates failure to recognize satisfiable constraint chains. This exemplifies the algorithm's inability to systematically explore the solution space.

### Request Rationale 

We seek commit access to integrate a formally verified alternative implementation that:

1. Resolves circular dependencies through topological sorting and scc decomposion.

2. Guarantees completeness via branch-and-bound solution search.

Our solution has been validated in the Rocq theorem prover (6.9k LOC proof).
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to