Operators
All types support the following operators:
- Equal ==
- Not Equal !=
The Bit
type supports the following logical operators.
- And &
- Or |
- Exclusive or ^
- Not ~
The Array
type supports the following operator.
- Dynamic bit selection bits_obj[add.O]
(select a bit dynamically using a magma value)
The Bits
type supports the following logical operators.
- And &
(elementwise)
- Or |
(elementwise)
- Exclusive or ^
(elementwise)
- Not ~
(elementwise)
- Logical right shift (with zeros) >>
- Logical left shift (with zeros) <<
The UInt
and SInt
types support all the logical operators
as well as arithmetic and comparison operastors.
- Add +
- Subtract/Negate -
- Multiply *
- Divide /
- Less than <
- Less than or equal <=
- Greater than >
- Greater than or equal >=
Note that the the right shift operator when applied to an SInt
becomes
an arithmetic shift right operator (which replicates the sign bit as it shifts right).
Verilog Users Guide
Here we provide a mapping between Verilog's standard operators, as defined by
IEEE Std 1800-2017: IEEE Standard for SystemVerilog—Unified Hardware Design,
Specification, and Verification
Language (page 256, Table 11-1
-- Operators and data types).
Assignment
Verilog Operator |
Magma Operator |
Types |
Context |
Comments |
= |
m.wire , <= (can only be used on magma input values) |
Any |
All |
Assignment cannot be overloaded for arbitrary Python variables, so in general we must use m.wire . We have added preliminary for assignment to attributes of magma values using the <= operator, which may be familiar for Verilog programmers using non-blocking assignments. Example: reg.I <= io.I . <= is purely syntactic sugar defiend on output values and calls m.wire under the hood. |
+= , -= , /= , *= |
None |
None |
All |
Support is not planned for these operators because magma cannot provide a clean semantics for them. Assignment only works for inputs to circuit instances and outputs of circuit definitions. AugAssign operators imply a value that is used both as an input an output. For example, inst.a +=1 would imply a is an output that feeds into binary add with 1, while also an input which consumes the result of the binary add. |
%= |
None |
None |
All |
See above |
&= , \|= , ^= |
None |
None |
All |
See above |
>>= , <<= |
None |
None |
All |
See above |
>>>= , <<<= |
None |
None |
All |
See above |
Conditional Operator
Verilog Operator |
Magma Operator |
Types |
Context |
Comments |
?: |
<true_exp> if <cond> else <false_exp> |
true_exp : T , cond_exp : Bit , false_exp : T |
m.circuit.combinational |
Currently only supported inside the m.circuit.combinational syntax because it requires inspection of the AST and rewriting it into a Mux . The true expression and the false expression should have the same type, the condition expression should have a Bit type. |
?: |
mantle.mux([<false_exp>, <true_exp>], <cond>) |
true_exp : T , cond_exp : Bit , false_exp : T |
All |
|
Unary Logical Operators
Verilog Operator |
Magma Operator |
Types |
Context |
Comments |
! |
TODO |
m.Bit , m.Bits |
All |
Logical operators like not cannot be overloaded in Python. Planned support for a mantle function m.lnot as an alternative |
~ , & , ~& , \| , ~\| , ^ , ~^ , ^~ |
TODO |
m.Bits |
All |
Python does not have built-in support for reduction operators. Use the python reduce function instead, e.g. reduce(mantle.nand, value) . |
Unary Arithmetic Operators
Verilog Operator |
Magma Operator |
Types |
Context |
Comments |
+ , - |
TODO |
m.SInt |
All |
Can override __neg__ and __pos__ to implement these |
++ , -- |
None |
None |
All |
No planned support since not available in Python, use += 1 and -= 1 instead. |
Binary Logical Operators
Verilog Operator |
Magma Operator |
Types |
Context |
Comments |
<< , >> |
<< , >> |
m.Bits |
All |
TODO: What does verilog expect for bit width of the shift value? What does magma expect? |
&& , \|\| |
TODO |
m.Bits |
All |
NOTE Python doesn't support overloading logical and and or , so using those Python operators will not work and will likely lead to difficult to debug error messages. In the future, will provide mantle functions instead and possibly an AST rewriter that translates these operators into the matnle function calls. |
-> , <-> |
None |
None |
All |
Impliciation and equivalence are used for verification, no planned support. If we wanted, we could provide mantle functions taht implement them as !expression1 || expression2 (implication) and (!expression1 || expression2) && (!expression2 || expression1) |
== , != |
== , != |
All |
All |
|
Binary Arithmetic Operators
Verilog Operator |
Magma Operator |
Types |
Context |
Comments |
+ , - , * , / , ** |
+ , - , * , / , ** |
UInt , SInt |
All |
TODO: Define numeric or integral type where UInt and SInt are sub types |
% |
UInt , SInt |
All |
TODO: Define numeric or integral type where UInt and SInt are sub types |
|
>>> , <<< |
>> , << |
SInt |
All |
Python does not provide a separate operator for arithmetic shift operators. Instead, we overload the meaning of the normal shift operators on SInt types. To use the logical variant, one can use the operator function directly mantle.lsr or convert the type to Bits or UInt . TODO: Double check that these are properly defined for SInt. Note, according to the SV spec, arithmetic left shift is the same as logical left shift. |
Concatenation and Replication Operators
Verilog Operator |
Magma Operator |
Types |
Context |
Comments |
{} |
m.concat |
All |
All |
NOTE: The semantics of m.concat are inverted from Verilog's (in the same way that Magma/Python's slicing syntax is inverted), so m.concat(x,y) corresponds to Verilog code of {y,x} as opposed to {x,y} |
{{}} |
TODO |
All |
All |
**TODO: We could use something similar to Python's list replication syntax: [4] * 4 |
Others
Verilog Operator |
Magma Operator |
Types |
Context |
Comments |
=== , !== |
None |
None |
None |
Magma currently does not support 4-state logic (=== tests for 1, 0, z, and x) |
==? , !=? |
None |
None |
None |
See above (==? treat X and Z values in a given bit position as a wildcard (matches any value)) |
inside |
None |
None |
None |
TODO: Could use Python's in syntax to implement this, but is this typically used in synthesized code? |
dist |
None |
None |
None |
Verification feature used for constraints |
{<<{}} , {>>{}} |
None |
None |
None |
|