40 """A convenient way to use BackedgeBuilder."""
41 if not isinstance(destination, OpOperand):
43 f
"cannot connect to destination of type {type(destination)}. "
45 value = get_value(source)
47 raise TypeError(f
"cannot connect from source of type {type(source)}")
49 index = destination.index
50 destination.operation.operands[index] = value
51 if destination.backedge_owner
and \
52 index
in destination.backedge_owner.backedges:
53 destination.backedge_owner.backedges[index].erase()
54 del destination.backedge_owner.backedges[index]
57def var_to_attribute(obj, none_on_fail: bool =
False) -> ir.Attribute:
58 """Create an MLIR attribute from a Python object for a few common cases."""
59 if isinstance(obj, ir.Attribute):
61 if isinstance(obj, bool):
62 return ir.BoolAttr.get(obj)
63 if isinstance(obj, int):
64 attrTy = ir.IntegerType.get_signless(64)
65 return ir.IntegerAttr.get(attrTy, obj)
66 if isinstance(obj, str):
67 return ir.StringAttr.get(obj)
68 if isinstance(obj, list):
69 arr = [var_to_attribute(x, none_on_fail)
for x
in obj]
71 return ir.ArrayAttr.get(arr)
75 raise TypeError(f
"Cannot convert type '{type(obj)}' to MLIR attribute")
83 if not isinstance(t, ir.Type):
84 raise TypeError(
"type_to_pytype only accepts MLIR Type objects")
88 if t.__class__ != ir.Type:
91 from .dialects
import esi, hw, seq, rtg, rtgtest
92 if ir.IntegerType.isinstance(t):
93 return ir.IntegerType(t)
94 if ir.NoneType.isinstance(t):
96 if ir.TupleType.isinstance(t):
97 return ir.TupleType(t)
98 if hw.ArrayType.isinstance(t):
99 return hw.ArrayType(t)
100 if hw.StructType.isinstance(t):
101 return hw.StructType(t)
102 if hw.TypeAliasType.isinstance(t):
103 return hw.TypeAliasType(t)
104 if hw.InOutType.isinstance(t):
105 return hw.InOutType(t)
106 if seq.ClockType.isinstance(t):
107 return seq.ClockType(t)
108 if esi.ChannelType.isinstance(t):
110 if esi.AnyType.isinstance(t):
112 if esi.BundleType.isinstance(t):
114 if rtg.LabelType.isinstance(t):
115 return rtg.LabelType(t)
116 if rtg.SetType.isinstance(t):
117 return rtg.SetType(t)
118 if rtg.BagType.isinstance(t):
119 return rtg.BagType(t)
120 if rtg.SequenceType.isinstance(t):
121 return rtg.SequenceType(t)
122 if rtg.RandomizedSequenceType.isinstance(t):
123 return rtg.RandomizedSequenceType(t)
124 if rtg.DictType.isinstance(t):
125 return rtg.DictType(t)
126 if rtg.ImmediateType.isinstance(t):
127 return rtg.ImmediateType(t)
128 if rtg.ArrayType.isinstance(t):
129 return rtg.ArrayType(t)
130 if rtg.MemoryType.isinstance(t):
131 return rtg.MemoryType(t)
132 if rtg.MemoryBlockType.isinstance(t):
133 return rtg.MemoryBlockType(t)
134 if rtg.TupleType.isinstance(t):
135 return rtg.TupleType(t)
136 if rtgtest.IntegerRegisterType.isinstance(t):
137 return rtgtest.IntegerRegisterType(t)
138 if rtgtest.CPUType.isinstance(t):
139 return rtgtest.CPUType(t)
141 raise TypeError(f
"Cannot convert {repr(t)} to python type")
147def attribute_to_var(attr):
151 if not isinstance(attr, ir.Attribute):
152 raise TypeError(
"attribute_to_var only accepts MLIR Attributes")
156 if attr.__class__ != ir.Attribute
and hasattr(attr,
"value"):
159 from .dialects
import hw, om
160 if ir.BoolAttr.isinstance(attr):
161 return ir.BoolAttr(attr).value
162 if ir.IntegerAttr.isinstance(attr):
163 return ir.IntegerAttr(attr).value
164 if hw.InnerSymAttr.isinstance(attr):
165 return ir.StringAttr(hw.InnerSymAttr(attr).symName).value
166 if ir.StringAttr.isinstance(attr):
167 return ir.StringAttr(attr).value
168 if ir.FlatSymbolRefAttr.isinstance(attr):
169 return ir.FlatSymbolRefAttr(attr).value
170 if ir.TypeAttr.isinstance(attr):
171 return ir.TypeAttr(attr).value
172 if ir.ArrayAttr.isinstance(attr):
173 arr = ir.ArrayAttr(attr)
174 return [attribute_to_var(x)
for x
in arr]
175 if ir.DictAttr.isinstance(attr):
176 dict = ir.DictAttr(attr)
177 return {i.name: attribute_to_var(i.attr)
for i
in dict}
178 if om.ReferenceAttr.isinstance(attr):
179 return attribute_to_var(om.ReferenceAttr(attr).inner_ref)
180 if hw.InnerRefAttr.isinstance(attr):
181 ref = hw.InnerRefAttr(attr)
182 return (ir.StringAttr(ref.module).value, ir.StringAttr(ref.name).value)
183 if om.ListAttr.isinstance(attr):
184 return list(map(attribute_to_var, om.ListAttr(attr)))
185 if om.OMIntegerAttr.isinstance(attr):
186 return int(str(om.OMIntegerAttr(attr)))
187 if om.PathAttr.isinstance(attr):
188 return om.PathAttr(attr).value
190 raise TypeError(f
"Cannot convert {repr(attr)} to python value")
__init__(self, cls, data_type=None, input_port_mapping=None, pre_args=None, post_args=None, needs_result_type=False, **kwargs)