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