xref: /aosp_15_r20/external/emboss/compiler/util/ir_util_test.py (revision 99e0aae7469b87d12f0ad23e61142c2d74c1ef70)
1*99e0aae7SDavid Rees# Copyright 2019 Google LLC
2*99e0aae7SDavid Rees#
3*99e0aae7SDavid Rees# Licensed under the Apache License, Version 2.0 (the "License");
4*99e0aae7SDavid Rees# you may not use this file except in compliance with the License.
5*99e0aae7SDavid Rees# You may obtain a copy of the License at
6*99e0aae7SDavid Rees#
7*99e0aae7SDavid Rees#     https://www.apache.org/licenses/LICENSE-2.0
8*99e0aae7SDavid Rees#
9*99e0aae7SDavid Rees# Unless required by applicable law or agreed to in writing, software
10*99e0aae7SDavid Rees# distributed under the License is distributed on an "AS IS" BASIS,
11*99e0aae7SDavid Rees# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*99e0aae7SDavid Rees# See the License for the specific language governing permissions and
13*99e0aae7SDavid Rees# limitations under the License.
14*99e0aae7SDavid Rees
15*99e0aae7SDavid Rees"""Tests for util.ir_util."""
16*99e0aae7SDavid Rees
17*99e0aae7SDavid Reesimport unittest
18*99e0aae7SDavid Reesfrom compiler.util import expression_parser
19*99e0aae7SDavid Reesfrom compiler.util import ir_data
20*99e0aae7SDavid Reesfrom compiler.util import ir_data_utils
21*99e0aae7SDavid Reesfrom compiler.util import ir_util
22*99e0aae7SDavid Rees
23*99e0aae7SDavid Rees
24*99e0aae7SDavid Reesdef _parse_expression(text):
25*99e0aae7SDavid Rees  return expression_parser.parse(text)
26*99e0aae7SDavid Rees
27*99e0aae7SDavid Rees
28*99e0aae7SDavid Reesclass IrUtilTest(unittest.TestCase):
29*99e0aae7SDavid Rees  """Tests for the miscellaneous utility functions in ir_util.py."""
30*99e0aae7SDavid Rees
31*99e0aae7SDavid Rees  def test_is_constant_integer(self):
32*99e0aae7SDavid Rees    self.assertTrue(ir_util.is_constant(_parse_expression("6")))
33*99e0aae7SDavid Rees    expression = _parse_expression("12")
34*99e0aae7SDavid Rees    # The type information should be ignored for constants like this one.
35*99e0aae7SDavid Rees    ir_data_utils.builder(expression).type.integer.CopyFrom(ir_data.IntegerType())
36*99e0aae7SDavid Rees    self.assertTrue(ir_util.is_constant(expression))
37*99e0aae7SDavid Rees
38*99e0aae7SDavid Rees  def test_is_constant_boolean(self):
39*99e0aae7SDavid Rees    self.assertTrue(ir_util.is_constant(_parse_expression("true")))
40*99e0aae7SDavid Rees    expression = _parse_expression("true")
41*99e0aae7SDavid Rees    # The type information should be ignored for constants like this one.
42*99e0aae7SDavid Rees    ir_data_utils.builder(expression).type.boolean.CopyFrom(ir_data.BooleanType())
43*99e0aae7SDavid Rees    self.assertTrue(ir_util.is_constant(expression))
44*99e0aae7SDavid Rees
45*99e0aae7SDavid Rees  def test_is_constant_enum(self):
46*99e0aae7SDavid Rees    self.assertTrue(ir_util.is_constant(ir_data.Expression(
47*99e0aae7SDavid Rees        constant_reference=ir_data.Reference(),
48*99e0aae7SDavid Rees        type=ir_data.ExpressionType(enumeration=ir_data.EnumType(value="12")))))
49*99e0aae7SDavid Rees
50*99e0aae7SDavid Rees  def test_is_constant_integer_type(self):
51*99e0aae7SDavid Rees    self.assertFalse(ir_util.is_constant_type(ir_data.ExpressionType(
52*99e0aae7SDavid Rees        integer=ir_data.IntegerType(
53*99e0aae7SDavid Rees            modulus="10",
54*99e0aae7SDavid Rees            modular_value="5",
55*99e0aae7SDavid Rees            minimum_value="-5",
56*99e0aae7SDavid Rees            maximum_value="15"))))
57*99e0aae7SDavid Rees    self.assertTrue(ir_util.is_constant_type(ir_data.ExpressionType(
58*99e0aae7SDavid Rees        integer=ir_data.IntegerType(
59*99e0aae7SDavid Rees            modulus="infinity",
60*99e0aae7SDavid Rees            modular_value="5",
61*99e0aae7SDavid Rees            minimum_value="5",
62*99e0aae7SDavid Rees            maximum_value="5"))))
63*99e0aae7SDavid Rees
64*99e0aae7SDavid Rees  def test_is_constant_boolean_type(self):
65*99e0aae7SDavid Rees    self.assertFalse(ir_util.is_constant_type(ir_data.ExpressionType(
66*99e0aae7SDavid Rees        boolean=ir_data.BooleanType())))
67*99e0aae7SDavid Rees    self.assertTrue(ir_util.is_constant_type(ir_data.ExpressionType(
68*99e0aae7SDavid Rees        boolean=ir_data.BooleanType(value=True))))
69*99e0aae7SDavid Rees    self.assertTrue(ir_util.is_constant_type(ir_data.ExpressionType(
70*99e0aae7SDavid Rees        boolean=ir_data.BooleanType(value=False))))
71*99e0aae7SDavid Rees
72*99e0aae7SDavid Rees  def test_is_constant_enumeration_type(self):
73*99e0aae7SDavid Rees    self.assertFalse(ir_util.is_constant_type(ir_data.ExpressionType(
74*99e0aae7SDavid Rees        enumeration=ir_data.EnumType())))
75*99e0aae7SDavid Rees    self.assertTrue(ir_util.is_constant_type(ir_data.ExpressionType(
76*99e0aae7SDavid Rees        enumeration=ir_data.EnumType(value="0"))))
77*99e0aae7SDavid Rees
78*99e0aae7SDavid Rees  def test_is_constant_opaque_type(self):
79*99e0aae7SDavid Rees    self.assertFalse(ir_util.is_constant_type(ir_data.ExpressionType(
80*99e0aae7SDavid Rees        opaque=ir_data.OpaqueType())))
81*99e0aae7SDavid Rees
82*99e0aae7SDavid Rees  def test_constant_value_of_integer(self):
83*99e0aae7SDavid Rees    self.assertEqual(6, ir_util.constant_value(_parse_expression("6")))
84*99e0aae7SDavid Rees
85*99e0aae7SDavid Rees  def test_constant_value_of_none(self):
86*99e0aae7SDavid Rees    self.assertIsNone(ir_util.constant_value(ir_data.Expression()))
87*99e0aae7SDavid Rees
88*99e0aae7SDavid Rees  def test_constant_value_of_addition(self):
89*99e0aae7SDavid Rees    self.assertEqual(6, ir_util.constant_value(_parse_expression("2+4")))
90*99e0aae7SDavid Rees
91*99e0aae7SDavid Rees  def test_constant_value_of_subtraction(self):
92*99e0aae7SDavid Rees    self.assertEqual(-2, ir_util.constant_value(_parse_expression("2-4")))
93*99e0aae7SDavid Rees
94*99e0aae7SDavid Rees  def test_constant_value_of_multiplication(self):
95*99e0aae7SDavid Rees    self.assertEqual(8, ir_util.constant_value(_parse_expression("2*4")))
96*99e0aae7SDavid Rees
97*99e0aae7SDavid Rees  def test_constant_value_of_equality(self):
98*99e0aae7SDavid Rees    self.assertFalse(ir_util.constant_value(_parse_expression("2 == 4")))
99*99e0aae7SDavid Rees
100*99e0aae7SDavid Rees  def test_constant_value_of_inequality(self):
101*99e0aae7SDavid Rees    self.assertTrue(ir_util.constant_value(_parse_expression("2 != 4")))
102*99e0aae7SDavid Rees
103*99e0aae7SDavid Rees  def test_constant_value_of_less(self):
104*99e0aae7SDavid Rees    self.assertTrue(ir_util.constant_value(_parse_expression("2 < 4")))
105*99e0aae7SDavid Rees
106*99e0aae7SDavid Rees  def test_constant_value_of_less_or_equal(self):
107*99e0aae7SDavid Rees    self.assertTrue(ir_util.constant_value(_parse_expression("2 <= 4")))
108*99e0aae7SDavid Rees
109*99e0aae7SDavid Rees  def test_constant_value_of_greater(self):
110*99e0aae7SDavid Rees    self.assertFalse(ir_util.constant_value(_parse_expression("2 > 4")))
111*99e0aae7SDavid Rees
112*99e0aae7SDavid Rees  def test_constant_value_of_greater_or_equal(self):
113*99e0aae7SDavid Rees    self.assertFalse(ir_util.constant_value(_parse_expression("2 >= 4")))
114*99e0aae7SDavid Rees
115*99e0aae7SDavid Rees  def test_constant_value_of_and(self):
116*99e0aae7SDavid Rees    self.assertFalse(ir_util.constant_value(_parse_expression("true && false")))
117*99e0aae7SDavid Rees    self.assertTrue(ir_util.constant_value(_parse_expression("true && true")))
118*99e0aae7SDavid Rees
119*99e0aae7SDavid Rees  def test_constant_value_of_or(self):
120*99e0aae7SDavid Rees    self.assertTrue(ir_util.constant_value(_parse_expression("true || false")))
121*99e0aae7SDavid Rees    self.assertFalse(
122*99e0aae7SDavid Rees        ir_util.constant_value(_parse_expression("false || false")))
123*99e0aae7SDavid Rees
124*99e0aae7SDavid Rees  def test_constant_value_of_choice(self):
125*99e0aae7SDavid Rees    self.assertEqual(
126*99e0aae7SDavid Rees        10, ir_util.constant_value(_parse_expression("false ? 20 : 10")))
127*99e0aae7SDavid Rees    self.assertEqual(
128*99e0aae7SDavid Rees        20, ir_util.constant_value(_parse_expression("true ? 20 : 10")))
129*99e0aae7SDavid Rees
130*99e0aae7SDavid Rees  def test_constant_value_of_choice_with_unknown_other_branch(self):
131*99e0aae7SDavid Rees    self.assertEqual(
132*99e0aae7SDavid Rees        10, ir_util.constant_value(_parse_expression("false ? foo : 10")))
133*99e0aae7SDavid Rees    self.assertEqual(
134*99e0aae7SDavid Rees        20, ir_util.constant_value(_parse_expression("true ? 20 : foo")))
135*99e0aae7SDavid Rees
136*99e0aae7SDavid Rees  def test_constant_value_of_maximum(self):
137*99e0aae7SDavid Rees    self.assertEqual(10,
138*99e0aae7SDavid Rees                     ir_util.constant_value(_parse_expression("$max(5, 10)")))
139*99e0aae7SDavid Rees    self.assertEqual(10,
140*99e0aae7SDavid Rees                     ir_util.constant_value(_parse_expression("$max(10)")))
141*99e0aae7SDavid Rees    self.assertEqual(
142*99e0aae7SDavid Rees        10,
143*99e0aae7SDavid Rees        ir_util.constant_value(_parse_expression("$max(5, 9, 7, 10, 6, -100)")))
144*99e0aae7SDavid Rees
145*99e0aae7SDavid Rees  def test_constant_value_of_boolean(self):
146*99e0aae7SDavid Rees    self.assertTrue(ir_util.constant_value(_parse_expression("true")))
147*99e0aae7SDavid Rees    self.assertFalse(ir_util.constant_value(_parse_expression("false")))
148*99e0aae7SDavid Rees
149*99e0aae7SDavid Rees  def test_constant_value_of_enum(self):
150*99e0aae7SDavid Rees    self.assertEqual(12, ir_util.constant_value(ir_data.Expression(
151*99e0aae7SDavid Rees        constant_reference=ir_data.Reference(),
152*99e0aae7SDavid Rees        type=ir_data.ExpressionType(enumeration=ir_data.EnumType(value="12")))))
153*99e0aae7SDavid Rees
154*99e0aae7SDavid Rees  def test_constant_value_of_integer_reference(self):
155*99e0aae7SDavid Rees    self.assertEqual(12, ir_util.constant_value(ir_data.Expression(
156*99e0aae7SDavid Rees        constant_reference=ir_data.Reference(),
157*99e0aae7SDavid Rees        type=ir_data.ExpressionType(
158*99e0aae7SDavid Rees            integer=ir_data.IntegerType(modulus="infinity",
159*99e0aae7SDavid Rees                                       modular_value="12")))))
160*99e0aae7SDavid Rees
161*99e0aae7SDavid Rees  def test_constant_value_of_boolean_reference(self):
162*99e0aae7SDavid Rees    self.assertTrue(ir_util.constant_value(ir_data.Expression(
163*99e0aae7SDavid Rees        constant_reference=ir_data.Reference(),
164*99e0aae7SDavid Rees        type=ir_data.ExpressionType(boolean=ir_data.BooleanType(value=True)))))
165*99e0aae7SDavid Rees
166*99e0aae7SDavid Rees  def test_constant_value_of_builtin_reference(self):
167*99e0aae7SDavid Rees    self.assertEqual(12, ir_util.constant_value(
168*99e0aae7SDavid Rees        ir_data.Expression(
169*99e0aae7SDavid Rees            builtin_reference=ir_data.Reference(
170*99e0aae7SDavid Rees                canonical_name=ir_data.CanonicalName(object_path=["$foo"]))),
171*99e0aae7SDavid Rees        {"$foo": 12}))
172*99e0aae7SDavid Rees
173*99e0aae7SDavid Rees  def test_constant_value_of_field_reference(self):
174*99e0aae7SDavid Rees    self.assertIsNone(ir_util.constant_value(_parse_expression("foo")))
175*99e0aae7SDavid Rees
176*99e0aae7SDavid Rees  def test_constant_value_of_missing_builtin_reference(self):
177*99e0aae7SDavid Rees    self.assertIsNone(ir_util.constant_value(
178*99e0aae7SDavid Rees        _parse_expression("$static_size_in_bits"), {"$bar": 12}))
179*99e0aae7SDavid Rees
180*99e0aae7SDavid Rees  def test_constant_value_of_present_builtin_reference(self):
181*99e0aae7SDavid Rees    self.assertEqual(12, ir_util.constant_value(
182*99e0aae7SDavid Rees        _parse_expression("$static_size_in_bits"),
183*99e0aae7SDavid Rees        {"$static_size_in_bits": 12}))
184*99e0aae7SDavid Rees
185*99e0aae7SDavid Rees  def test_constant_false_value_of_operator_and_with_missing_value(self):
186*99e0aae7SDavid Rees    self.assertIs(False, ir_util.constant_value(
187*99e0aae7SDavid Rees        _parse_expression("false && foo"), {"bar": 12}))
188*99e0aae7SDavid Rees    self.assertIs(False, ir_util.constant_value(
189*99e0aae7SDavid Rees        _parse_expression("foo && false"), {"bar": 12}))
190*99e0aae7SDavid Rees
191*99e0aae7SDavid Rees  def test_constant_false_value_of_operator_and_known_value(self):
192*99e0aae7SDavid Rees    self.assertTrue(ir_util.constant_value(
193*99e0aae7SDavid Rees        _parse_expression("true && $is_statically_sized"),
194*99e0aae7SDavid Rees        {"$is_statically_sized": True}))
195*99e0aae7SDavid Rees
196*99e0aae7SDavid Rees  def test_constant_none_value_of_operator_and_with_missing_value(self):
197*99e0aae7SDavid Rees    self.assertIsNone(ir_util.constant_value(
198*99e0aae7SDavid Rees        _parse_expression("true && foo"), {"bar": 12}))
199*99e0aae7SDavid Rees    self.assertIsNone(ir_util.constant_value(
200*99e0aae7SDavid Rees        _parse_expression("foo && true"), {"bar": 12}))
201*99e0aae7SDavid Rees
202*99e0aae7SDavid Rees  def test_constant_false_value_of_operator_or_with_missing_value(self):
203*99e0aae7SDavid Rees    self.assertTrue(ir_util.constant_value(
204*99e0aae7SDavid Rees        _parse_expression("true || foo"), {"bar": 12}))
205*99e0aae7SDavid Rees    self.assertTrue(ir_util.constant_value(
206*99e0aae7SDavid Rees        _parse_expression("foo || true"), {"bar": 12}))
207*99e0aae7SDavid Rees
208*99e0aae7SDavid Rees  def test_constant_none_value_of_operator_or_with_missing_value(self):
209*99e0aae7SDavid Rees    self.assertIsNone(ir_util.constant_value(
210*99e0aae7SDavid Rees        _parse_expression("foo || false"), {"bar": 12}))
211*99e0aae7SDavid Rees    self.assertIsNone(ir_util.constant_value(
212*99e0aae7SDavid Rees        _parse_expression("false || foo"), {"bar": 12}))
213*99e0aae7SDavid Rees
214*99e0aae7SDavid Rees  def test_constant_value_of_operator_plus_with_missing_value(self):
215*99e0aae7SDavid Rees    self.assertIsNone(ir_util.constant_value(
216*99e0aae7SDavid Rees        _parse_expression("12 + foo"), {"bar": 12}))
217*99e0aae7SDavid Rees
218*99e0aae7SDavid Rees  def test_is_array(self):
219*99e0aae7SDavid Rees    self.assertTrue(
220*99e0aae7SDavid Rees        ir_util.is_array(ir_data.Type(array_type=ir_data.ArrayType())))
221*99e0aae7SDavid Rees    self.assertFalse(
222*99e0aae7SDavid Rees        ir_util.is_array(ir_data.Type(atomic_type=ir_data.AtomicType())))
223*99e0aae7SDavid Rees
224*99e0aae7SDavid Rees  def test_get_attribute(self):
225*99e0aae7SDavid Rees    type_def = ir_data.TypeDefinition(attribute=[
226*99e0aae7SDavid Rees        ir_data.Attribute(
227*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=ir_data.Expression()),
228*99e0aae7SDavid Rees            name=ir_data.Word(text="phil")),
229*99e0aae7SDavid Rees        ir_data.Attribute(
230*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("false")),
231*99e0aae7SDavid Rees            name=ir_data.Word(text="bob"),
232*99e0aae7SDavid Rees            is_default=True),
233*99e0aae7SDavid Rees        ir_data.Attribute(
234*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("true")),
235*99e0aae7SDavid Rees            name=ir_data.Word(text="bob")),
236*99e0aae7SDavid Rees        ir_data.Attribute(
237*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("false")),
238*99e0aae7SDavid Rees            name=ir_data.Word(text="bob2")),
239*99e0aae7SDavid Rees        ir_data.Attribute(
240*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("true")),
241*99e0aae7SDavid Rees            name=ir_data.Word(text="bob2"),
242*99e0aae7SDavid Rees            is_default=True),
243*99e0aae7SDavid Rees        ir_data.Attribute(
244*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("false")),
245*99e0aae7SDavid Rees            name=ir_data.Word(text="bob3"),
246*99e0aae7SDavid Rees            is_default=True),
247*99e0aae7SDavid Rees        ir_data.Attribute(
248*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("false")),
249*99e0aae7SDavid Rees            name=ir_data.Word()),
250*99e0aae7SDavid Rees    ])
251*99e0aae7SDavid Rees    self.assertEqual(
252*99e0aae7SDavid Rees        ir_data.AttributeValue(expression=_parse_expression("true")),
253*99e0aae7SDavid Rees        ir_util.get_attribute(type_def.attribute, "bob"))
254*99e0aae7SDavid Rees    self.assertEqual(
255*99e0aae7SDavid Rees        ir_data.AttributeValue(expression=_parse_expression("false")),
256*99e0aae7SDavid Rees        ir_util.get_attribute(type_def.attribute, "bob2"))
257*99e0aae7SDavid Rees    self.assertEqual(None, ir_util.get_attribute(type_def.attribute, "Bob"))
258*99e0aae7SDavid Rees    self.assertEqual(None, ir_util.get_attribute(type_def.attribute, "bob3"))
259*99e0aae7SDavid Rees
260*99e0aae7SDavid Rees  def test_get_boolean_attribute(self):
261*99e0aae7SDavid Rees    type_def = ir_data.TypeDefinition(attribute=[
262*99e0aae7SDavid Rees        ir_data.Attribute(
263*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=ir_data.Expression()),
264*99e0aae7SDavid Rees            name=ir_data.Word(text="phil")),
265*99e0aae7SDavid Rees        ir_data.Attribute(
266*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("false")),
267*99e0aae7SDavid Rees            name=ir_data.Word(text="bob"),
268*99e0aae7SDavid Rees            is_default=True),
269*99e0aae7SDavid Rees        ir_data.Attribute(
270*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("true")),
271*99e0aae7SDavid Rees            name=ir_data.Word(text="bob")),
272*99e0aae7SDavid Rees        ir_data.Attribute(
273*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("false")),
274*99e0aae7SDavid Rees            name=ir_data.Word(text="bob2")),
275*99e0aae7SDavid Rees        ir_data.Attribute(
276*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("true")),
277*99e0aae7SDavid Rees            name=ir_data.Word(text="bob2"),
278*99e0aae7SDavid Rees            is_default=True),
279*99e0aae7SDavid Rees        ir_data.Attribute(
280*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("false")),
281*99e0aae7SDavid Rees            name=ir_data.Word(text="bob3"),
282*99e0aae7SDavid Rees            is_default=True),
283*99e0aae7SDavid Rees        ir_data.Attribute(
284*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("false")),
285*99e0aae7SDavid Rees            name=ir_data.Word()),
286*99e0aae7SDavid Rees    ])
287*99e0aae7SDavid Rees    self.assertTrue(ir_util.get_boolean_attribute(type_def.attribute, "bob"))
288*99e0aae7SDavid Rees    self.assertTrue(ir_util.get_boolean_attribute(type_def.attribute,
289*99e0aae7SDavid Rees                                                  "bob",
290*99e0aae7SDavid Rees                                                  default_value=False))
291*99e0aae7SDavid Rees    self.assertFalse(ir_util.get_boolean_attribute(type_def.attribute, "bob2"))
292*99e0aae7SDavid Rees    self.assertFalse(ir_util.get_boolean_attribute(type_def.attribute,
293*99e0aae7SDavid Rees                                                   "bob2",
294*99e0aae7SDavid Rees                                                   default_value=True))
295*99e0aae7SDavid Rees    self.assertIsNone(ir_util.get_boolean_attribute(type_def.attribute, "Bob"))
296*99e0aae7SDavid Rees    self.assertTrue(ir_util.get_boolean_attribute(type_def.attribute,
297*99e0aae7SDavid Rees                                                  "Bob",
298*99e0aae7SDavid Rees                                                  default_value=True))
299*99e0aae7SDavid Rees    self.assertIsNone(ir_util.get_boolean_attribute(type_def.attribute, "bob3"))
300*99e0aae7SDavid Rees
301*99e0aae7SDavid Rees  def test_get_integer_attribute(self):
302*99e0aae7SDavid Rees    type_def = ir_data.TypeDefinition(attribute=[
303*99e0aae7SDavid Rees        ir_data.Attribute(
304*99e0aae7SDavid Rees            value=ir_data.AttributeValue(
305*99e0aae7SDavid Rees                expression=ir_data.Expression(
306*99e0aae7SDavid Rees                    type=ir_data.ExpressionType(integer=ir_data.IntegerType()))),
307*99e0aae7SDavid Rees            name=ir_data.Word(text="phil")),
308*99e0aae7SDavid Rees        ir_data.Attribute(
309*99e0aae7SDavid Rees            value=ir_data.AttributeValue(
310*99e0aae7SDavid Rees                expression=ir_data.Expression(
311*99e0aae7SDavid Rees                    constant=ir_data.NumericConstant(value="20"),
312*99e0aae7SDavid Rees                    type=ir_data.ExpressionType(integer=ir_data.IntegerType(
313*99e0aae7SDavid Rees                        modular_value="20",
314*99e0aae7SDavid Rees                        modulus="infinity")))),
315*99e0aae7SDavid Rees            name=ir_data.Word(text="bob"),
316*99e0aae7SDavid Rees            is_default=True),
317*99e0aae7SDavid Rees        ir_data.Attribute(
318*99e0aae7SDavid Rees            value=ir_data.AttributeValue(
319*99e0aae7SDavid Rees                expression=ir_data.Expression(
320*99e0aae7SDavid Rees                    constant=ir_data.NumericConstant(value="10"),
321*99e0aae7SDavid Rees                    type=ir_data.ExpressionType(integer=ir_data.IntegerType(
322*99e0aae7SDavid Rees                        modular_value="10",
323*99e0aae7SDavid Rees                        modulus="infinity")))),
324*99e0aae7SDavid Rees            name=ir_data.Word(text="bob")),
325*99e0aae7SDavid Rees        ir_data.Attribute(
326*99e0aae7SDavid Rees            value=ir_data.AttributeValue(
327*99e0aae7SDavid Rees                expression=ir_data.Expression(
328*99e0aae7SDavid Rees                    constant=ir_data.NumericConstant(value="5"),
329*99e0aae7SDavid Rees                    type=ir_data.ExpressionType(integer=ir_data.IntegerType(
330*99e0aae7SDavid Rees                        modular_value="5",
331*99e0aae7SDavid Rees                        modulus="infinity")))),
332*99e0aae7SDavid Rees            name=ir_data.Word(text="bob2")),
333*99e0aae7SDavid Rees        ir_data.Attribute(
334*99e0aae7SDavid Rees            value=ir_data.AttributeValue(
335*99e0aae7SDavid Rees                expression=ir_data.Expression(
336*99e0aae7SDavid Rees                    constant=ir_data.NumericConstant(value="0"),
337*99e0aae7SDavid Rees                    type=ir_data.ExpressionType(integer=ir_data.IntegerType(
338*99e0aae7SDavid Rees                        modular_value="0",
339*99e0aae7SDavid Rees                        modulus="infinity")))),
340*99e0aae7SDavid Rees            name=ir_data.Word(text="bob2"),
341*99e0aae7SDavid Rees            is_default=True),
342*99e0aae7SDavid Rees        ir_data.Attribute(
343*99e0aae7SDavid Rees            value=ir_data.AttributeValue(
344*99e0aae7SDavid Rees                expression=ir_data.Expression(
345*99e0aae7SDavid Rees                    constant=ir_data.NumericConstant(value="30"),
346*99e0aae7SDavid Rees                    type=ir_data.ExpressionType(integer=ir_data.IntegerType(
347*99e0aae7SDavid Rees                        modular_value="30",
348*99e0aae7SDavid Rees                        modulus="infinity")))),
349*99e0aae7SDavid Rees            name=ir_data.Word(text="bob3"),
350*99e0aae7SDavid Rees            is_default=True),
351*99e0aae7SDavid Rees        ir_data.Attribute(
352*99e0aae7SDavid Rees            value=ir_data.AttributeValue(
353*99e0aae7SDavid Rees                expression=ir_data.Expression(
354*99e0aae7SDavid Rees                    function=ir_data.Function(
355*99e0aae7SDavid Rees                        function=ir_data.FunctionMapping.ADDITION,
356*99e0aae7SDavid Rees                        args=[
357*99e0aae7SDavid Rees                            ir_data.Expression(
358*99e0aae7SDavid Rees                                constant=ir_data.NumericConstant(value="100"),
359*99e0aae7SDavid Rees                                type=ir_data.ExpressionType(
360*99e0aae7SDavid Rees                                    integer=ir_data.IntegerType(
361*99e0aae7SDavid Rees                                        modular_value="100",
362*99e0aae7SDavid Rees                                        modulus="infinity"))),
363*99e0aae7SDavid Rees                            ir_data.Expression(
364*99e0aae7SDavid Rees                                constant=ir_data.NumericConstant(value="100"),
365*99e0aae7SDavid Rees                                type=ir_data.ExpressionType(
366*99e0aae7SDavid Rees                                    integer=ir_data.IntegerType(
367*99e0aae7SDavid Rees                                        modular_value="100",
368*99e0aae7SDavid Rees                                        modulus="infinity")))
369*99e0aae7SDavid Rees                        ]),
370*99e0aae7SDavid Rees                    type=ir_data.ExpressionType(integer=ir_data.IntegerType(
371*99e0aae7SDavid Rees                        modular_value="200",
372*99e0aae7SDavid Rees                        modulus="infinity")))),
373*99e0aae7SDavid Rees            name=ir_data.Word(text="bob4")),
374*99e0aae7SDavid Rees        ir_data.Attribute(
375*99e0aae7SDavid Rees            value=ir_data.AttributeValue(
376*99e0aae7SDavid Rees                expression=ir_data.Expression(
377*99e0aae7SDavid Rees                    constant=ir_data.NumericConstant(value="40"),
378*99e0aae7SDavid Rees                    type=ir_data.ExpressionType(integer=ir_data.IntegerType(
379*99e0aae7SDavid Rees                        modular_value="40",
380*99e0aae7SDavid Rees                        modulus="infinity")))),
381*99e0aae7SDavid Rees            name=ir_data.Word()),
382*99e0aae7SDavid Rees    ])
383*99e0aae7SDavid Rees    self.assertEqual(10,
384*99e0aae7SDavid Rees                     ir_util.get_integer_attribute(type_def.attribute, "bob"))
385*99e0aae7SDavid Rees    self.assertEqual(5,
386*99e0aae7SDavid Rees                     ir_util.get_integer_attribute(type_def.attribute, "bob2"))
387*99e0aae7SDavid Rees    self.assertIsNone(ir_util.get_integer_attribute(type_def.attribute, "Bob"))
388*99e0aae7SDavid Rees    self.assertEqual(10, ir_util.get_integer_attribute(type_def.attribute,
389*99e0aae7SDavid Rees                                                       "Bob",
390*99e0aae7SDavid Rees                                                       default_value=10))
391*99e0aae7SDavid Rees    self.assertIsNone(ir_util.get_integer_attribute(type_def.attribute, "bob3"))
392*99e0aae7SDavid Rees    self.assertEqual(200, ir_util.get_integer_attribute(type_def.attribute,
393*99e0aae7SDavid Rees                                                        "bob4"))
394*99e0aae7SDavid Rees
395*99e0aae7SDavid Rees  def test_get_duplicate_attribute(self):
396*99e0aae7SDavid Rees    type_def = ir_data.TypeDefinition(attribute=[
397*99e0aae7SDavid Rees        ir_data.Attribute(
398*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=ir_data.Expression()),
399*99e0aae7SDavid Rees            name=ir_data.Word(text="phil")),
400*99e0aae7SDavid Rees        ir_data.Attribute(
401*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("true")),
402*99e0aae7SDavid Rees            name=ir_data.Word(text="bob")),
403*99e0aae7SDavid Rees        ir_data.Attribute(
404*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("false")),
405*99e0aae7SDavid Rees            name=ir_data.Word(text="bob")),
406*99e0aae7SDavid Rees        ir_data.Attribute(
407*99e0aae7SDavid Rees            value=ir_data.AttributeValue(expression=_parse_expression("false")),
408*99e0aae7SDavid Rees            name=ir_data.Word()),
409*99e0aae7SDavid Rees    ])
410*99e0aae7SDavid Rees    self.assertRaises(AssertionError, ir_util.get_attribute, type_def.attribute,
411*99e0aae7SDavid Rees                      "bob")
412*99e0aae7SDavid Rees
413*99e0aae7SDavid Rees  def test_find_object(self):
414*99e0aae7SDavid Rees    ir = ir_data_utils.IrDataSerializer.from_json(ir_data.EmbossIr,
415*99e0aae7SDavid Rees        """{
416*99e0aae7SDavid Rees          "module": [
417*99e0aae7SDavid Rees            {
418*99e0aae7SDavid Rees              "type": [
419*99e0aae7SDavid Rees                {
420*99e0aae7SDavid Rees                  "structure": {
421*99e0aae7SDavid Rees                    "field": [
422*99e0aae7SDavid Rees                      {
423*99e0aae7SDavid Rees                        "name": {
424*99e0aae7SDavid Rees                          "name": { "text": "field" },
425*99e0aae7SDavid Rees                          "canonical_name": {
426*99e0aae7SDavid Rees                            "module_file": "test.emb",
427*99e0aae7SDavid Rees                            "object_path": [ "Foo", "field" ]
428*99e0aae7SDavid Rees                          }
429*99e0aae7SDavid Rees                        }
430*99e0aae7SDavid Rees                      }
431*99e0aae7SDavid Rees                    ]
432*99e0aae7SDavid Rees                  },
433*99e0aae7SDavid Rees                  "name": {
434*99e0aae7SDavid Rees                    "name": { "text": "Foo" },
435*99e0aae7SDavid Rees                    "canonical_name": {
436*99e0aae7SDavid Rees                      "module_file": "test.emb",
437*99e0aae7SDavid Rees                      "object_path": [ "Foo" ]
438*99e0aae7SDavid Rees                    }
439*99e0aae7SDavid Rees                  },
440*99e0aae7SDavid Rees                  "runtime_parameter": [
441*99e0aae7SDavid Rees                    {
442*99e0aae7SDavid Rees                      "name": {
443*99e0aae7SDavid Rees                        "name": { "text": "parameter" },
444*99e0aae7SDavid Rees                        "canonical_name": {
445*99e0aae7SDavid Rees                          "module_file": "test.emb",
446*99e0aae7SDavid Rees                          "object_path": [ "Foo", "parameter" ]
447*99e0aae7SDavid Rees                        }
448*99e0aae7SDavid Rees                      }
449*99e0aae7SDavid Rees                    }
450*99e0aae7SDavid Rees                  ]
451*99e0aae7SDavid Rees                },
452*99e0aae7SDavid Rees                {
453*99e0aae7SDavid Rees                  "enumeration": {
454*99e0aae7SDavid Rees                    "value": [
455*99e0aae7SDavid Rees                      {
456*99e0aae7SDavid Rees                        "name": {
457*99e0aae7SDavid Rees                          "name": { "text": "QUX" },
458*99e0aae7SDavid Rees                          "canonical_name": {
459*99e0aae7SDavid Rees                            "module_file": "test.emb",
460*99e0aae7SDavid Rees                            "object_path": [ "Bar", "QUX" ]
461*99e0aae7SDavid Rees                          }
462*99e0aae7SDavid Rees                        }
463*99e0aae7SDavid Rees                      }
464*99e0aae7SDavid Rees                    ]
465*99e0aae7SDavid Rees                  },
466*99e0aae7SDavid Rees                  "name": {
467*99e0aae7SDavid Rees                    "name": { "text": "Bar" },
468*99e0aae7SDavid Rees                    "canonical_name": {
469*99e0aae7SDavid Rees                      "module_file": "test.emb",
470*99e0aae7SDavid Rees                      "object_path": [ "Bar" ]
471*99e0aae7SDavid Rees                    }
472*99e0aae7SDavid Rees                  }
473*99e0aae7SDavid Rees                }
474*99e0aae7SDavid Rees              ],
475*99e0aae7SDavid Rees              "source_file_name": "test.emb"
476*99e0aae7SDavid Rees            },
477*99e0aae7SDavid Rees            {
478*99e0aae7SDavid Rees              "type": [
479*99e0aae7SDavid Rees                {
480*99e0aae7SDavid Rees                  "external": {},
481*99e0aae7SDavid Rees                  "name": {
482*99e0aae7SDavid Rees                    "name": { "text": "UInt" },
483*99e0aae7SDavid Rees                    "canonical_name": {
484*99e0aae7SDavid Rees                      "module_file": "",
485*99e0aae7SDavid Rees                      "object_path": [ "UInt" ]
486*99e0aae7SDavid Rees                    }
487*99e0aae7SDavid Rees                  }
488*99e0aae7SDavid Rees                }
489*99e0aae7SDavid Rees              ],
490*99e0aae7SDavid Rees              "source_file_name": ""
491*99e0aae7SDavid Rees            }
492*99e0aae7SDavid Rees          ]
493*99e0aae7SDavid Rees        }""")
494*99e0aae7SDavid Rees
495*99e0aae7SDavid Rees    # Test that find_object works with any of its four "name" types.
496*99e0aae7SDavid Rees    canonical_name_of_foo = ir_data.CanonicalName(module_file="test.emb",
497*99e0aae7SDavid Rees                                                 object_path=["Foo"])
498*99e0aae7SDavid Rees    self.assertEqual(ir.module[0].type[0], ir_util.find_object(
499*99e0aae7SDavid Rees        ir_data.Reference(canonical_name=canonical_name_of_foo), ir))
500*99e0aae7SDavid Rees    self.assertEqual(ir.module[0].type[0], ir_util.find_object(
501*99e0aae7SDavid Rees        ir_data.NameDefinition(canonical_name=canonical_name_of_foo), ir))
502*99e0aae7SDavid Rees    self.assertEqual(ir.module[0].type[0],
503*99e0aae7SDavid Rees                     ir_util.find_object(canonical_name_of_foo, ir))
504*99e0aae7SDavid Rees    self.assertEqual(ir.module[0].type[0],
505*99e0aae7SDavid Rees                     ir_util.find_object(("test.emb", "Foo"), ir))
506*99e0aae7SDavid Rees
507*99e0aae7SDavid Rees    # Test that find_object works with objects other than structs.
508*99e0aae7SDavid Rees    self.assertEqual(ir.module[0].type[1],
509*99e0aae7SDavid Rees                     ir_util.find_object(("test.emb", "Bar"), ir))
510*99e0aae7SDavid Rees    self.assertEqual(ir.module[1].type[0],
511*99e0aae7SDavid Rees                     ir_util.find_object(("", "UInt"), ir))
512*99e0aae7SDavid Rees    self.assertEqual(ir.module[0].type[0].structure.field[0],
513*99e0aae7SDavid Rees                     ir_util.find_object(("test.emb", "Foo", "field"), ir))
514*99e0aae7SDavid Rees    self.assertEqual(ir.module[0].type[0].runtime_parameter[0],
515*99e0aae7SDavid Rees                     ir_util.find_object(("test.emb", "Foo", "parameter"), ir))
516*99e0aae7SDavid Rees    self.assertEqual(ir.module[0].type[1].enumeration.value[0],
517*99e0aae7SDavid Rees                     ir_util.find_object(("test.emb", "Bar", "QUX"), ir))
518*99e0aae7SDavid Rees    self.assertEqual(ir.module[0], ir_util.find_object(("test.emb",), ir))
519*99e0aae7SDavid Rees    self.assertEqual(ir.module[1], ir_util.find_object(("",), ir))
520*99e0aae7SDavid Rees
521*99e0aae7SDavid Rees    # Test searching for non-present objects.
522*99e0aae7SDavid Rees    self.assertIsNone(ir_util.find_object_or_none(("not_test.emb",), ir))
523*99e0aae7SDavid Rees    self.assertIsNone(ir_util.find_object_or_none(("test.emb", "NotFoo"), ir))
524*99e0aae7SDavid Rees    self.assertIsNone(
525*99e0aae7SDavid Rees        ir_util.find_object_or_none(("test.emb", "Foo", "not_field"), ir))
526*99e0aae7SDavid Rees    self.assertIsNone(
527*99e0aae7SDavid Rees        ir_util.find_object_or_none(("test.emb", "Foo", "field", "no_subfield"),
528*99e0aae7SDavid Rees                                    ir))
529*99e0aae7SDavid Rees    self.assertIsNone(
530*99e0aae7SDavid Rees        ir_util.find_object_or_none(("test.emb", "Bar", "NOT_QUX"), ir))
531*99e0aae7SDavid Rees    self.assertIsNone(
532*99e0aae7SDavid Rees        ir_util.find_object_or_none(("test.emb", "Bar", "QUX", "no_subenum"),
533*99e0aae7SDavid Rees                                    ir))
534*99e0aae7SDavid Rees
535*99e0aae7SDavid Rees    # Test that find_parent_object works with any of its four "name" types.
536*99e0aae7SDavid Rees    self.assertEqual(ir.module[0], ir_util.find_parent_object(
537*99e0aae7SDavid Rees        ir_data.Reference(canonical_name=canonical_name_of_foo), ir))
538*99e0aae7SDavid Rees    self.assertEqual(ir.module[0], ir_util.find_parent_object(
539*99e0aae7SDavid Rees        ir_data.NameDefinition(canonical_name=canonical_name_of_foo), ir))
540*99e0aae7SDavid Rees    self.assertEqual(ir.module[0],
541*99e0aae7SDavid Rees                     ir_util.find_parent_object(canonical_name_of_foo, ir))
542*99e0aae7SDavid Rees    self.assertEqual(ir.module[0],
543*99e0aae7SDavid Rees                     ir_util.find_parent_object(("test.emb", "Foo"), ir))
544*99e0aae7SDavid Rees
545*99e0aae7SDavid Rees    # Test that find_parent_object works with objects other than structs.
546*99e0aae7SDavid Rees    self.assertEqual(ir.module[0],
547*99e0aae7SDavid Rees                     ir_util.find_parent_object(("test.emb", "Bar"), ir))
548*99e0aae7SDavid Rees    self.assertEqual(ir.module[1], ir_util.find_parent_object(("", "UInt"), ir))
549*99e0aae7SDavid Rees    self.assertEqual(ir.module[0].type[0],
550*99e0aae7SDavid Rees                     ir_util.find_parent_object(("test.emb", "Foo", "field"),
551*99e0aae7SDavid Rees                                                ir))
552*99e0aae7SDavid Rees    self.assertEqual(ir.module[0].type[1],
553*99e0aae7SDavid Rees                     ir_util.find_parent_object(("test.emb", "Bar", "QUX"), ir))
554*99e0aae7SDavid Rees
555*99e0aae7SDavid Rees  def test_hashable_form_of_reference(self):
556*99e0aae7SDavid Rees    self.assertEqual(
557*99e0aae7SDavid Rees        ("t.emb", "Foo", "Bar"),
558*99e0aae7SDavid Rees        ir_util.hashable_form_of_reference(ir_data.Reference(
559*99e0aae7SDavid Rees            canonical_name=ir_data.CanonicalName(module_file="t.emb",
560*99e0aae7SDavid Rees                                                object_path=["Foo", "Bar"]))))
561*99e0aae7SDavid Rees    self.assertEqual(
562*99e0aae7SDavid Rees        ("t.emb", "Foo", "Bar"),
563*99e0aae7SDavid Rees        ir_util.hashable_form_of_reference(ir_data.NameDefinition(
564*99e0aae7SDavid Rees            canonical_name=ir_data.CanonicalName(module_file="t.emb",
565*99e0aae7SDavid Rees                                                object_path=["Foo", "Bar"]))))
566*99e0aae7SDavid Rees
567*99e0aae7SDavid Rees  def test_get_base_type(self):
568*99e0aae7SDavid Rees    array_type_ir = ir_data_utils.IrDataSerializer.from_json(ir_data.Type,
569*99e0aae7SDavid Rees        """{
570*99e0aae7SDavid Rees          "array_type": {
571*99e0aae7SDavid Rees            "element_count": { "constant": { "value": "20" } },
572*99e0aae7SDavid Rees            "base_type": {
573*99e0aae7SDavid Rees              "array_type": {
574*99e0aae7SDavid Rees                "element_count": { "constant": { "value": "10" } },
575*99e0aae7SDavid Rees                "base_type": {
576*99e0aae7SDavid Rees                  "atomic_type": {
577*99e0aae7SDavid Rees                    "reference": { },
578*99e0aae7SDavid Rees                    "source_location": { "start": { "line": 5 } }
579*99e0aae7SDavid Rees                  }
580*99e0aae7SDavid Rees                },
581*99e0aae7SDavid Rees                "source_location": { "start": { "line": 4 } }
582*99e0aae7SDavid Rees              }
583*99e0aae7SDavid Rees            },
584*99e0aae7SDavid Rees            "source_location": { "start": { "line": 3 } }
585*99e0aae7SDavid Rees          }
586*99e0aae7SDavid Rees        }""")
587*99e0aae7SDavid Rees    base_type_ir = array_type_ir.array_type.base_type.array_type.base_type
588*99e0aae7SDavid Rees    self.assertEqual(base_type_ir, ir_util.get_base_type(array_type_ir))
589*99e0aae7SDavid Rees    self.assertEqual(base_type_ir, ir_util.get_base_type(
590*99e0aae7SDavid Rees        array_type_ir.array_type.base_type))
591*99e0aae7SDavid Rees    self.assertEqual(base_type_ir, ir_util.get_base_type(base_type_ir))
592*99e0aae7SDavid Rees
593*99e0aae7SDavid Rees  def test_size_of_type_in_bits(self):
594*99e0aae7SDavid Rees    ir = ir_data_utils.IrDataSerializer.from_json(ir_data.EmbossIr,
595*99e0aae7SDavid Rees        """{
596*99e0aae7SDavid Rees          "module": [{
597*99e0aae7SDavid Rees            "type": [{
598*99e0aae7SDavid Rees              "name": {
599*99e0aae7SDavid Rees                "name": { "text": "Baz" },
600*99e0aae7SDavid Rees                "canonical_name": {
601*99e0aae7SDavid Rees                  "module_file": "s.emb",
602*99e0aae7SDavid Rees                  "object_path": ["Baz"]
603*99e0aae7SDavid Rees                }
604*99e0aae7SDavid Rees              }
605*99e0aae7SDavid Rees            }],
606*99e0aae7SDavid Rees            "source_file_name": "s.emb"
607*99e0aae7SDavid Rees          },
608*99e0aae7SDavid Rees          {
609*99e0aae7SDavid Rees            "type": [{
610*99e0aae7SDavid Rees              "name": {
611*99e0aae7SDavid Rees                "name": { "text": "UInt" },
612*99e0aae7SDavid Rees                "canonical_name": {
613*99e0aae7SDavid Rees                  "module_file": "",
614*99e0aae7SDavid Rees                  "object_path": ["UInt"]
615*99e0aae7SDavid Rees                }
616*99e0aae7SDavid Rees              }
617*99e0aae7SDavid Rees            },
618*99e0aae7SDavid Rees            {
619*99e0aae7SDavid Rees              "name": {
620*99e0aae7SDavid Rees                "name": { "text": "Byte" },
621*99e0aae7SDavid Rees                "canonical_name": {
622*99e0aae7SDavid Rees                  "module_file": "",
623*99e0aae7SDavid Rees                  "object_path": ["Byte"]
624*99e0aae7SDavid Rees                }
625*99e0aae7SDavid Rees              },
626*99e0aae7SDavid Rees              "attribute": [{
627*99e0aae7SDavid Rees                "name": { "text": "fixed_size_in_bits" },
628*99e0aae7SDavid Rees                "value": {
629*99e0aae7SDavid Rees                  "expression": {
630*99e0aae7SDavid Rees                    "constant": { "value": "8" },
631*99e0aae7SDavid Rees                    "type": {
632*99e0aae7SDavid Rees                      "integer": { "modular_value": "8", "modulus": "infinity" }
633*99e0aae7SDavid Rees                    }
634*99e0aae7SDavid Rees                  }
635*99e0aae7SDavid Rees                }
636*99e0aae7SDavid Rees              }]
637*99e0aae7SDavid Rees            }],
638*99e0aae7SDavid Rees            "source_file_name": ""
639*99e0aae7SDavid Rees          }]
640*99e0aae7SDavid Rees        }""")
641*99e0aae7SDavid Rees
642*99e0aae7SDavid Rees    fixed_size_type = ir_data_utils.IrDataSerializer.from_json(ir_data.Type,
643*99e0aae7SDavid Rees        """{
644*99e0aae7SDavid Rees          "atomic_type": {
645*99e0aae7SDavid Rees            "reference": {
646*99e0aae7SDavid Rees              "canonical_name": { "module_file": "", "object_path": ["Byte"] }
647*99e0aae7SDavid Rees             }
648*99e0aae7SDavid Rees          }
649*99e0aae7SDavid Rees        }""")
650*99e0aae7SDavid Rees    self.assertEqual(8, ir_util.fixed_size_of_type_in_bits(fixed_size_type, ir))
651*99e0aae7SDavid Rees
652*99e0aae7SDavid Rees    explicit_size_type = ir_data_utils.IrDataSerializer.from_json(ir_data.Type,
653*99e0aae7SDavid Rees        """{
654*99e0aae7SDavid Rees          "atomic_type": {
655*99e0aae7SDavid Rees            "reference": {
656*99e0aae7SDavid Rees              "canonical_name": { "module_file": "", "object_path": ["UInt"] }
657*99e0aae7SDavid Rees            }
658*99e0aae7SDavid Rees          },
659*99e0aae7SDavid Rees          "size_in_bits": {
660*99e0aae7SDavid Rees            "constant": { "value": "32" },
661*99e0aae7SDavid Rees            "type": {
662*99e0aae7SDavid Rees              "integer": { "modular_value": "32", "modulus": "infinity" }
663*99e0aae7SDavid Rees            }
664*99e0aae7SDavid Rees          }
665*99e0aae7SDavid Rees        }""")
666*99e0aae7SDavid Rees    self.assertEqual(32,
667*99e0aae7SDavid Rees                     ir_util.fixed_size_of_type_in_bits(explicit_size_type, ir))
668*99e0aae7SDavid Rees
669*99e0aae7SDavid Rees    fixed_size_array = ir_data_utils.IrDataSerializer.from_json(ir_data.Type,
670*99e0aae7SDavid Rees        """{
671*99e0aae7SDavid Rees          "array_type": {
672*99e0aae7SDavid Rees            "base_type": {
673*99e0aae7SDavid Rees              "atomic_type": {
674*99e0aae7SDavid Rees                "reference": {
675*99e0aae7SDavid Rees                  "canonical_name": { "module_file": "", "object_path": ["Byte"] }
676*99e0aae7SDavid Rees                }
677*99e0aae7SDavid Rees              }
678*99e0aae7SDavid Rees            },
679*99e0aae7SDavid Rees            "element_count": {
680*99e0aae7SDavid Rees              "constant": { "value": "5" },
681*99e0aae7SDavid Rees              "type": {
682*99e0aae7SDavid Rees                "integer": { "modular_value": "5", "modulus": "infinity" }
683*99e0aae7SDavid Rees              }
684*99e0aae7SDavid Rees            }
685*99e0aae7SDavid Rees          }
686*99e0aae7SDavid Rees        }""")
687*99e0aae7SDavid Rees    self.assertEqual(40,
688*99e0aae7SDavid Rees                     ir_util.fixed_size_of_type_in_bits(fixed_size_array, ir))
689*99e0aae7SDavid Rees
690*99e0aae7SDavid Rees    fixed_size_2d_array = ir_data_utils.IrDataSerializer.from_json(ir_data.Type,
691*99e0aae7SDavid Rees        """{
692*99e0aae7SDavid Rees          "array_type": {
693*99e0aae7SDavid Rees            "base_type": {
694*99e0aae7SDavid Rees              "array_type": {
695*99e0aae7SDavid Rees                "base_type": {
696*99e0aae7SDavid Rees                  "atomic_type": {
697*99e0aae7SDavid Rees                    "reference": {
698*99e0aae7SDavid Rees                      "canonical_name": {
699*99e0aae7SDavid Rees                        "module_file": "",
700*99e0aae7SDavid Rees                        "object_path": ["Byte"]
701*99e0aae7SDavid Rees                      }
702*99e0aae7SDavid Rees                    }
703*99e0aae7SDavid Rees                  }
704*99e0aae7SDavid Rees                },
705*99e0aae7SDavid Rees                "element_count": {
706*99e0aae7SDavid Rees                  "constant": { "value": "5" },
707*99e0aae7SDavid Rees                  "type": {
708*99e0aae7SDavid Rees                    "integer": { "modular_value": "5", "modulus": "infinity" }
709*99e0aae7SDavid Rees                  }
710*99e0aae7SDavid Rees                }
711*99e0aae7SDavid Rees              }
712*99e0aae7SDavid Rees            },
713*99e0aae7SDavid Rees            "element_count": {
714*99e0aae7SDavid Rees              "constant": { "value": "2" },
715*99e0aae7SDavid Rees              "type": {
716*99e0aae7SDavid Rees                "integer": { "modular_value": "2", "modulus": "infinity" }
717*99e0aae7SDavid Rees              }
718*99e0aae7SDavid Rees            }
719*99e0aae7SDavid Rees          }
720*99e0aae7SDavid Rees        }""")
721*99e0aae7SDavid Rees    self.assertEqual(
722*99e0aae7SDavid Rees        80, ir_util.fixed_size_of_type_in_bits(fixed_size_2d_array, ir))
723*99e0aae7SDavid Rees
724*99e0aae7SDavid Rees    automatic_size_array = ir_data_utils.IrDataSerializer.from_json(ir_data.Type,
725*99e0aae7SDavid Rees        """{
726*99e0aae7SDavid Rees          "array_type": {
727*99e0aae7SDavid Rees            "base_type": {
728*99e0aae7SDavid Rees              "array_type": {
729*99e0aae7SDavid Rees                "base_type": {
730*99e0aae7SDavid Rees                  "atomic_type": {
731*99e0aae7SDavid Rees                    "reference": {
732*99e0aae7SDavid Rees                      "canonical_name": {
733*99e0aae7SDavid Rees                        "module_file": "",
734*99e0aae7SDavid Rees                        "object_path": ["Byte"]
735*99e0aae7SDavid Rees                      }
736*99e0aae7SDavid Rees                    }
737*99e0aae7SDavid Rees                  }
738*99e0aae7SDavid Rees                },
739*99e0aae7SDavid Rees                "element_count": {
740*99e0aae7SDavid Rees                  "constant": { "value": "5" },
741*99e0aae7SDavid Rees                  "type": {
742*99e0aae7SDavid Rees                    "integer": { "modular_value": "5", "modulus": "infinity" }
743*99e0aae7SDavid Rees                  }
744*99e0aae7SDavid Rees                }
745*99e0aae7SDavid Rees              }
746*99e0aae7SDavid Rees            },
747*99e0aae7SDavid Rees            "automatic": { }
748*99e0aae7SDavid Rees          }
749*99e0aae7SDavid Rees      }""")
750*99e0aae7SDavid Rees    self.assertIsNone(
751*99e0aae7SDavid Rees        ir_util.fixed_size_of_type_in_bits(automatic_size_array, ir))
752*99e0aae7SDavid Rees
753*99e0aae7SDavid Rees    variable_size_type = ir_data_utils.IrDataSerializer.from_json(ir_data.Type,
754*99e0aae7SDavid Rees        """{
755*99e0aae7SDavid Rees          "atomic_type": {
756*99e0aae7SDavid Rees            "reference": {
757*99e0aae7SDavid Rees              "canonical_name": { "module_file": "", "object_path": ["UInt"] }
758*99e0aae7SDavid Rees            }
759*99e0aae7SDavid Rees          }
760*99e0aae7SDavid Rees        }""")
761*99e0aae7SDavid Rees    self.assertIsNone(
762*99e0aae7SDavid Rees        ir_util.fixed_size_of_type_in_bits(variable_size_type, ir))
763*99e0aae7SDavid Rees
764*99e0aae7SDavid Rees    no_size_type = ir_data_utils.IrDataSerializer.from_json(ir_data.Type,
765*99e0aae7SDavid Rees        """{
766*99e0aae7SDavid Rees          "atomic_type": {
767*99e0aae7SDavid Rees            "reference": {
768*99e0aae7SDavid Rees              "canonical_name": {
769*99e0aae7SDavid Rees                "module_file": "s.emb",
770*99e0aae7SDavid Rees                "object_path": ["Baz"]
771*99e0aae7SDavid Rees              }
772*99e0aae7SDavid Rees            }
773*99e0aae7SDavid Rees          }
774*99e0aae7SDavid Rees        }""")
775*99e0aae7SDavid Rees    self.assertIsNone(ir_util.fixed_size_of_type_in_bits(no_size_type, ir))
776*99e0aae7SDavid Rees
777*99e0aae7SDavid Rees  def test_field_is_virtual(self):
778*99e0aae7SDavid Rees    self.assertTrue(ir_util.field_is_virtual(ir_data.Field()))
779*99e0aae7SDavid Rees
780*99e0aae7SDavid Rees  def test_field_is_not_virtual(self):
781*99e0aae7SDavid Rees    self.assertFalse(ir_util.field_is_virtual(
782*99e0aae7SDavid Rees        ir_data.Field(location=ir_data.FieldLocation())))
783*99e0aae7SDavid Rees
784*99e0aae7SDavid Rees  def test_field_is_read_only(self):
785*99e0aae7SDavid Rees    self.assertTrue(ir_util.field_is_read_only(ir_data.Field(
786*99e0aae7SDavid Rees        write_method=ir_data.WriteMethod(read_only=True))))
787*99e0aae7SDavid Rees
788*99e0aae7SDavid Rees  def test_field_is_not_read_only(self):
789*99e0aae7SDavid Rees    self.assertFalse(ir_util.field_is_read_only(
790*99e0aae7SDavid Rees        ir_data.Field(location=ir_data.FieldLocation())))
791*99e0aae7SDavid Rees    self.assertFalse(ir_util.field_is_read_only(ir_data.Field(
792*99e0aae7SDavid Rees        write_method=ir_data.WriteMethod())))
793*99e0aae7SDavid Rees
794*99e0aae7SDavid Rees
795*99e0aae7SDavid Reesif __name__ == "__main__":
796*99e0aae7SDavid Rees  unittest.main()
797