Skip to content

Do something with Value.implies #1239

Closed
@whitequark

Description

@whitequark

Value.implies is a rarely used and not well-known counterpart to __or__, __xor__, etc operators. It is defined as:

    def implies(premise, conclusion):
        return ~premise | conclusion

It was originally added to aid in the development of formal testbenches, but is obviously usable in any code:

m.d.comb += Assert((self.depth > 0).implies(~empty))

The problem with this operator is that it's bitwise and sign-extending, without warning (simply because the underlying logical operators are). This is extremely weird and it's difficult to see where this behavior would be desirable. In short, if premise and conclusion are both multi-bit, then the result is a logical OR of the arrow operator applied pairwise to each bit of the premise and conclusion.


What should we do with it? Options:

  1. Deprecate and remove
  2. Deprecate use with signed operands (even though x | y or x ^ y all accept signed operands)
  3. Deprecate use with unequal length operands but allow signed operands
  4. Cast both operands with .bool() like return ~premise.bool() | conclusion.bool()
    • This is a hard compatibility break, though we can probably do a deprecation cycle?
  5. Something else

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions