CIRCT  19.0.0git
seq.py
Go to the documentation of this file.
1 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
2 # See https://llvm.org/LICENSE.txt for license information.
3 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4 
5 from . import hw
6 from .._mlir_libs._circt._seq import *
7 from ..dialects._ods_common import _cext as _ods_cext
8 from ..ir import IntegerType, OpView, StringAttr
9 from ..support import BackedgeBuilder, NamedValueOpView
10 from ._seq_ops_gen import *
11 from ._seq_ops_gen import _Dialect
12 from .seq import CompRegOp
13 
14 
15 # Create a computational register whose input is the given value, and is clocked
16 # by the given clock. If a reset is provided, the register will be reset by that
17 # signal. If a reset value is provided, the register will reset to that,
18 # otherwise it will reset to zero. If name is provided, the register will be
19 # named.
20 def reg(value, clock, reset=None, reset_value=None, name=None, sym_name=None):
21  from . import hw
22  from ..ir import IntegerAttr
23  value_type = value.type
24  if reset:
25  if not reset_value:
26  zero = IntegerAttr.get(value_type, 0)
27  reset_value = hw.ConstantOp(zero).result
28  return CompRegOp.create(value_type,
29  input=value,
30  clk=clock,
31  reset=reset,
32  reset_value=reset_value,
33  name=name,
34  sym_name=sym_name).data.value
35  else:
36  return CompRegOp.create(value_type,
37  input=value,
38  clk=clock,
39  name=name,
40  sym_name=sym_name).data.value
41 
42 
43 class CompRegLikeBuilder(NamedValueOpView):
44 
45  def result_names(self):
46  return ["data"]
47 
48  def create_initial_value(self, index, data_type, arg_name):
49  if arg_name == "input":
50  operand_type = data_type
51  else:
52  operand_type = IntegerType.get_signless(1)
53  return BackedgeBuilder.create(operand_type, arg_name, self)
54 
55 
57 
58  def __init__(self,
59  data_type,
60  input,
61  clk,
62  clockEnable=None,
63  *,
64  reset=None,
65  reset_value=None,
66  power_on_value=None,
67  name=None,
68  sym_name=None,
69  loc=None,
70  ip=None):
71  operands = [input, clk]
72  results = []
73  attributes = {}
74  results.append(data_type)
75  operand_segment_sizes = [1, 1]
76  if isinstance(self, CompRegOp):
77  if clockEnable is not None:
78  raise Exception("Clock enable not supported on compreg")
79  elif isinstance(self, CompRegClockEnabledOp):
80  if clockEnable is None:
81  raise Exception("Clock enable required on compreg.ce")
82  operands.append(clockEnable)
83  operand_segment_sizes.append(1)
84  else:
85  assert False, "Class not recognized"
86  if reset is not None and reset_value is not None:
87  operands.append(reset)
88  operands.append(reset_value)
89  operand_segment_sizes += [1, 1]
90  else:
91  operand_segment_sizes += [0, 0]
92  operands += [None, None]
93 
94  if power_on_value is not None:
95  operands.append(power_on_value)
96  operand_segment_sizes.append(1)
97  else:
98  operands.append(None)
99  operand_segment_sizes.append(0)
100  if name is None:
101  attributes["name"] = StringAttr.get("")
102  else:
103  attributes["name"] = StringAttr.get(name)
104  if sym_name is not None:
105  attributes["inner_sym"] = hw.InnerSymAttr.get(StringAttr.get(sym_name))
106 
107  self._ODS_OPERAND_SEGMENTS_ODS_OPERAND_SEGMENTS = operand_segment_sizes
108 
109  OpView.__init__(
110  self,
111  self.build_generic(
112  attributes=attributes,
113  results=results,
114  operands=operands,
115  loc=loc,
116  ip=ip,
117  ),
118  )
119 
120 
122 
123  def operand_names(self):
124  return ["input", "clk"]
125 
126 
127 @_ods_cext.register_operation(_Dialect, replace=True)
129 
130  @classmethod
131  def create(cls,
132  result_type,
133  reset=None,
134  reset_value=None,
135  name=None,
136  sym_name=None,
137  **kwargs):
138  return CompRegBuilder(cls,
139  result_type,
140  kwargs,
141  reset=reset,
142  reset_value=reset_value,
143  name=name,
144  sym_name=sym_name,
145  needs_result_type=True)
146 
147 
149 
150  def operand_names(self):
151  return ["input", "clk", "clockEnable"]
152 
153 
154 @_ods_cext.register_operation(_Dialect, replace=True)
156 
157  @classmethod
158  def create(cls,
159  result_type,
160  reset=None,
161  reset_value=None,
162  name=None,
163  sym_name=None,
164  **kwargs):
165  return CompRegClockEnabledBuilder(cls,
166  result_type,
167  kwargs,
168  reset=reset,
169  reset_value=reset_value,
170  name=name,
171  sym_name=sym_name,
172  needs_result_type=True)
def operand_names(self)
Definition: seq.py:123
def create(cls, result_type, reset=None, reset_value=None, name=None, sym_name=None, **kwargs)
Definition: seq.py:164
def create_initial_value(self, index, data_type, arg_name)
Definition: seq.py:48
def result_names(self)
Definition: seq.py:45
def __init__(self, data_type, input, clk, clockEnable=None, *reset=None, reset_value=None, power_on_value=None, name=None, sym_name=None, loc=None, ip=None)
Definition: seq.py:70
_ODS_OPERAND_SEGMENTS
Definition: seq.py:107
def create(cls, result_type, reset=None, reset_value=None, name=None, sym_name=None, **kwargs)
Definition: seq.py:137
def reg(value, clock, reset=None, reset_value=None, name=None, sym_name=None)
Definition: seq.py:20