예제 #1
0
    def test_connectivity(self) -> None:
        self.assertEqual(len(self.pb.constraints), 3)

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'source'
        expected_conn.connected.block_port.ref.steps.add().name = 'source'
        expected_conn.connected.block_port.ref.steps.add().name = 'source'
        self.assertIn(expected_conn, self.pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add(
        ).reserved_param = edgir.ALLOCATE
        expected_conn.connected.block_port.ref.steps.add().name = 'sink1'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        self.assertIn(expected_conn, self.pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add(
        ).reserved_param = edgir.ALLOCATE
        expected_conn.connected.block_port.ref.steps.add().name = 'sink2'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        self.assertIn(expected_conn, self.pb.constraints.values())
예제 #2
0
    def test_connectivity(self) -> None:
        pb = ExportedImplicitConnectBlock()._elaborated_def_to_proto()

        self.assertEqual(len(pb.constraints),
                         5)  # including source export, connect, port required

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'implicit_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add(
        ).reserved_param = edgir.ALLOCATE
        expected_conn.connected.block_port.ref.steps.add(
        ).name = 'block_sink_0'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'implicit_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add(
        ).reserved_param = edgir.ALLOCATE
        expected_conn.connected.block_port.ref.steps.add(
        ).name = 'block_sink_1'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        self.assertIn(expected_conn, pb.constraints.values())
예제 #3
0
    def test_connects(self) -> None:
        self.assertEqual(
            len(self.pb.constraints), 6
        )  # TODO: maybe filter by connection types in future for robustness

        expected_conn = edgir.ValueExpr()
        expected_conn.exported.exterior_port.ref.steps.add().name = 'source'
        expected_conn.exported.exterior_port.ref.steps.add().name = 'a'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'a_net'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'source'
        self.assertIn(expected_conn, self.pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.exported.exterior_port.map_extract.container.ref.steps.add(
        ).name = 'sinks'
        expected_conn.exported.exterior_port.map_extract.path.steps.add(
        ).name = 'a'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'a_net'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'sinks'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).reserved_param = edgir.ALLOCATE
        self.assertIn(expected_conn, self.pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.exported.exterior_port.ref.steps.add().name = 'source'
        expected_conn.exported.exterior_port.ref.steps.add().name = 'b'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'b_net'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'source'
        self.assertIn(expected_conn, self.pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.exported.exterior_port.map_extract.container.ref.steps.add(
        ).name = 'sinks'
        expected_conn.exported.exterior_port.map_extract.path.steps.add(
        ).name = 'b'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'b_net'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'sinks'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).reserved_param = edgir.ALLOCATE
        self.assertIn(expected_conn, self.pb.constraints.values())
예제 #4
0
 def expr_to_proto(
         self, expr: ConstraintExpr,
         ref_map: IdentityDict[Refable,
                               edgir.LocalPath]) -> edgir.ValueExpr:
     pb = edgir.ValueExpr()
     pb.literal.text.val = self.value
     return pb
예제 #5
0
 def expr_to_proto(
         self, expr: ConstraintExpr,
         ref_map: IdentityDict[Refable,
                               edgir.LocalPath]) -> edgir.ValueExpr:
     pb = edgir.ValueExpr()
     pb.ref.CopyFrom(ref_map[expr])
     return pb
예제 #6
0
    def test_exported_hierarchy(self):
        compiled_design = ScalaCompiler.compile(ExportPortHierarchyBlockTop)
        pb = compiled_design.contents.blocks['block'].hierarchy

        self.assertEqual(
            pb.self_class.target.name,
            'edg_core.test_hierarchy_block.ExportPortHierarchyBlock')

        self.assertEqual(len(pb.ports), 1)
        self.assertEqual(pb.ports['exported'].port.self_class.target.name,
                         'edg_core.test_common.TestPortSink')

        self.assertEqual(len(pb.blocks), 1)
        self.assertEqual(pb.blocks['sink'].hierarchy.self_class.target.name,
                         'edg_core.test_common.TestBlockSink')
        self.assertEqual(
            pb.blocks['sink'].hierarchy.ports['sink'].port.self_class.target.
            name, 'edg_core.test_common.TestPortSink')

        self.assertEqual(len(pb.links), 0)

        expected_conn = edgir.ValueExpr()
        expected_conn.exported.exterior_port.ref.steps.add().name = 'exported'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'sink'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'sink'
        self.assertIn(expected_conn, pb.constraints.values())
예제 #7
0
 def expr_to_proto(
         self, expr: ConstraintExpr,
         ref_map: IdentityDict[Refable,
                               edgir.LocalPath]) -> edgir.ValueExpr:
     pb = edgir.ValueExpr()
     pb.ref.CopyFrom(ref_map[self.src])
     pb.ref.steps.add().reserved_param = edgir.LENGTH
     return pb
예제 #8
0
 def expr_to_proto(
         self, expr: ConstraintExpr,
         ref_map: IdentityDict[Refable,
                               edgir.LocalPath]) -> edgir.ValueExpr:
     pb = edgir.ValueExpr()
     pb.unary_set.op = self.op_map[self.op]
     pb.unary_set.vals.CopyFrom(self.src._expr_to_proto(ref_map))
     return pb
예제 #9
0
 def make_assign(
         target: ConstraintExpr, value: ConstraintExpr,
         ref_map: IdentityDict[Refable,
                               edgir.LocalPath]) -> edgir.ValueExpr:
     pb = edgir.ValueExpr()
     pb.assign.dst.CopyFrom(ref_map[target])
     pb.assign.src.CopyFrom(value._expr_to_proto(ref_map))
     return pb
예제 #10
0
 def expr_to_proto(
         self, expr: ConstraintExpr,
         ref_map: IdentityDict[Refable,
                               edgir.LocalPath]) -> edgir.ValueExpr:
     pb = edgir.ValueExpr()
     pb.literal.range.minimum.floating.val = self.value.lower
     pb.literal.range.maximum.floating.val = self.value.upper
     return pb
예제 #11
0
    def test_constraints(self):
        # partial test of constraints, only the ones that are more interesting than tested elsewhere
        # namely, ones that deal with map and reduce operations
        expected_constr = edgir.ValueExpr()
        expected_constr.assign.dst.steps.add().name = 'float_param_sink_range'
        expected_constr.assign.src.binary.op = edgir.BinaryExpr.RANGE

        expected_constr.assign.src.binary.lhs.unary_set.op = edgir.UnarySetExpr.MINIMUM
        expected_constr.assign.src.binary.lhs.unary_set.vals.map_extract.container.ref.steps.add(
        ).name = 'sinks'
        expected_constr.assign.src.binary.lhs.unary_set.vals.map_extract.path.steps.add(
        ).name = 'float_param'

        expected_constr.assign.src.binary.rhs.unary_set.op = edgir.UnarySetExpr.MAXIMUM
        expected_constr.assign.src.binary.rhs.unary_set.vals.map_extract.container.ref.steps.add(
        ).name = 'sinks'
        expected_constr.assign.src.binary.rhs.unary_set.vals.map_extract.path.steps.add(
        ).name = 'float_param'
        self.assertIn(expected_constr, self.pb.constraints.values())

        expected_constr = edgir.ValueExpr()
        expected_constr.binary.op = edgir.BinaryExpr.WITHIN
        expected_constr.binary.lhs.ref.steps.add().name = 'source'
        expected_constr.binary.lhs.ref.steps.add().name = 'float_param'
        expected_constr.binary.rhs.ref.steps.add().name = 'source'
        expected_constr.binary.rhs.ref.steps.add().name = 'float_param_limit'
        self.assertIn(expected_constr, self.pb.constraints.values())

        expected_constr = edgir.ValueExpr()
        expected_name = '(init)range_param_sink_common'
        expected_constr.assign.dst.steps.add().name = 'range_param_sink_common'
        expected_constr.assign.src.unary_set.op = edgir.UnarySetExpr.INTERSECTION
        expected_constr.assign.src.unary_set.vals.map_extract.container.ref.steps.add(
        ).name = 'sinks'
        expected_constr.assign.src.unary_set.vals.map_extract.path.steps.add(
        ).name = 'range_limit'
        self.assertEqual(expected_constr, self.pb.constraints[expected_name])

        expected_constr = edgir.ValueExpr()
        expected_constr.binary.op = edgir.BinaryExpr.WITHIN
        expected_constr.binary.lhs.ref.steps.add().name = 'source'
        expected_constr.binary.lhs.ref.steps.add().name = 'range_param'
        expected_constr.binary.rhs.ref.steps.add(
        ).name = 'range_param_sink_common'
        self.assertIn(expected_constr, self.pb.constraints.values())
예제 #12
0
 def expr_to_proto(
         self, expr: ConstraintExpr,
         ref_map: IdentityDict[Refable,
                               edgir.LocalPath]) -> edgir.ValueExpr:
     pb = edgir.ValueExpr()
     pb.ifThenElse.cond.CopyFrom(self.cond._expr_to_proto(ref_map))
     pb.ifThenElse.tru.CopyFrom(self.then_val._expr_to_proto(ref_map))
     pb.ifThenElse.fal.CopyFrom(self.else_val._expr_to_proto(ref_map))
     return pb
예제 #13
0
 def expr_to_proto(
         self, expr: ConstraintExpr,
         ref_map: IdentityDict[Refable,
                               edgir.LocalPath]) -> edgir.ValueExpr:
     pb = edgir.ValueExpr()
     pb.binary.op = edgir.BinaryExpr.RANGE
     pb.binary.lhs.CopyFrom(self.lower._expr_to_proto(ref_map))
     pb.binary.rhs.CopyFrom(self.upper._expr_to_proto(ref_map))
     return pb
예제 #14
0
    def verify_pb(self, pb: edgir.HierarchyBlock) -> None:
        self.assertEqual(len(pb.constraints),
                         5)  # including source export, connect, port required

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_chain_0'
        expected_conn.connected.link_port.ref.steps.add().name = 'source'
        expected_conn.connected.block_port.ref.steps.add().name = 'output'
        expected_conn.connected.block_port.ref.steps.add().name = 'source'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_chain_0'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add(
        ).reserved_param = edgir.ALLOCATE
        expected_conn.connected.block_port.ref.steps.add().name = 'inout'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_chain_0'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add(
        ).reserved_param = edgir.ALLOCATE
        expected_conn.connected.block_port.ref.steps.add().name = 'inputoutput'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_chain_1'
        expected_conn.connected.link_port.ref.steps.add().name = 'source'
        expected_conn.connected.block_port.ref.steps.add().name = 'inputoutput'
        expected_conn.connected.block_port.ref.steps.add().name = 'source'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_chain_1'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add(
        ).reserved_param = edgir.ALLOCATE
        expected_conn.connected.block_port.ref.steps.add().name = 'input'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        self.assertIn(expected_conn, pb.constraints.values())
예제 #15
0
 def expr_to_proto(
         self, expr: ConstraintExpr,
         ref_map: IdentityDict[Refable,
                               edgir.LocalPath]) -> edgir.ValueExpr:
     contained_map = self.container._get_contained_ref_map()
     pb = edgir.ValueExpr()
     pb.map_extract.container.ref.CopyFrom(
         ref_map[self.container])  # TODO support arbitrary refs
     pb.map_extract.path.CopyFrom(contained_map[self.elt])
     return pb
예제 #16
0
    def test_footprint(self):
        self.assertIn(
            edgir.AssignLit(['footprint_name'],
                            'Resistor_SMD:R_0603_1608Metric'),
            self.pb.constraints.values())
        self.assertIn(edgir.AssignLit(['value'], '1k'),
                      self.pb.constraints.values())
        self.assertIn(edgir.AssignLit(['refdes_prefix'], 'R'),
                      self.pb.constraints.values())

        expected_pinning = edgir.Metadata()
        path = edgir.ValueExpr()
        path.ref.steps.add().name = 'port_1'
        expected_pinning.members.node['1'].bin_leaf = path.SerializeToString()
        path = edgir.ValueExpr()
        path.ref.steps.add().name = 'port_2'
        expected_pinning.members.node['2'].bin_leaf = path.SerializeToString()
        self.assertEqual(self.pb.meta.members.node['pinning'],
                         expected_pinning)
예제 #17
0
    def test_connectivity(self) -> None:
        self.assertEqual(len(self.pb.constraints), 1)

        expected_conn = edgir.ValueExpr()
        expected_conn.exported.exterior_port.ref.steps.add().name = 'exported'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'sink'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'sink'
        self.assertIn(expected_conn, self.pb.constraints.values())
예제 #18
0
    def test_connectivity(self) -> None:
        pb = AdapterTestTop()._elaborated_def_to_proto()

        self.assertEqual(
            pb.blocks['(adapter)adapter_src.port'].lib_elem.target.name,
            "edg_core.test_port_adapter.AdapterPortAdapter")
        # ignore the other blocks

        self.assertEqual(len(pb.constraints), 4)

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.block_port.ref.steps.add().name = 'adapter_src'
        expected_conn.connected.block_port.ref.steps.add().name = 'port'
        expected_conn.connected.link_port.ref.steps.add(
        ).name = '(adapter_net)adapter_src.port'
        expected_conn.connected.link_port.ref.steps.add().name = 'ports'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add(
        ).name = '(adapter_net)adapter_src.port'
        expected_conn.connected.link_port.ref.steps.add().name = 'ports'
        expected_conn.connected.block_port.ref.steps.add(
        ).name = '(adapter)adapter_src.port'
        expected_conn.connected.block_port.ref.steps.add().name = 'src'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.block_port.ref.steps.add(
        ).name = '(adapter)adapter_src.port'
        expected_conn.connected.block_port.ref.steps.add().name = 'dst'
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'source'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        self.assertIn(expected_conn, pb.constraints.values())
예제 #19
0
    def test_constraints(self):
        self.assertEqual(len(self.pb.constraints), 2)

        expected_constr = edgir.ValueExpr()
        expected_constr.assign.dst.steps.add().name = 'outer_port'
        expected_constr.assign.dst.steps.add().name = 'float_param'
        expected_constr.assign.src.ref.steps.add().name = 'inner_link'
        expected_constr.assign.src.ref.steps.add(
        ).reserved_param = edgir.CONNECTED_LINK
        expected_constr.assign.src.ref.steps.add(
        ).name = 'float_param_sink_sum'
        self.assertIn(expected_constr, self.pb.constraints.values())

        expected_constr = edgir.ValueExpr()
        expected_constr.binary.op = edgir.BinaryExpr.EQ
        expected_constr.assign.dst.steps.add().name = 'outer_port'
        expected_constr.assign.dst.steps.add().name = 'range_limit'
        expected_constr.assign.src.ref.steps.add().name = 'inner_link'
        expected_constr.assign.src.ref.steps.add(
        ).reserved_param = edgir.CONNECTED_LINK
        expected_constr.assign.src.ref.steps.add(
        ).name = 'range_param_sink_common'
        self.assertIn(expected_constr, self.pb.constraints.values())
예제 #20
0
    def test_connectivity(self) -> None:
        self.assertEqual(len(self.pb.constraints), 4)

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.block_port.ref.steps.add(
        ).name = '(bridge)source_port'
        expected_conn.connected.block_port.ref.steps.add().name = 'inner_link'
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'source'
        self.assertIn(expected_conn, self.pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.exported.exterior_port.ref.steps.add(
        ).name = 'source_port'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = '(bridge)source_port'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'outer_port'
        self.assertIn(expected_conn, self.pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.block_port.ref.steps.add().name = 'sink1'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add(
        ).reserved_param = edgir.ALLOCATE
        self.assertIn(expected_conn, self.pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.block_port.ref.steps.add().name = 'sink2'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add(
        ).reserved_param = edgir.ALLOCATE
        self.assertIn(expected_conn, self.pb.constraints.values())
예제 #21
0
    def test_bridge_hierarchy(self):
        compiled_design = ScalaCompiler.compile(PortBridgeHierarchyBlockTop)
        pb = compiled_design.contents.blocks['block'].hierarchy

        self.assertEqual(
            pb.self_class.target.name,
            'edg_core.test_hierarchy_block.PortBridgeHierarchyBlock')

        self.assertEqual(len(pb.ports), 1)
        self.assertEqual(pb.ports['source_port'].port.self_class.target.name,
                         "edg_core.test_common.TestPortSink")

        self.assertEqual(len(pb.blocks), 3)
        self.assertEqual(
            pb.blocks['(bridge)source_port'].hierarchy.self_class.target.name,
            'edg_core.test_common.TestPortBridge')
        self.assertEqual(
            pb.blocks['(bridge)source_port'].hierarchy.ports['inner_link'].
            port.self_class.target.name, "edg_core.test_common.TestPortSource")
        self.assertEqual(
            pb.blocks['(bridge)source_port'].hierarchy.ports['outer_port'].
            port.self_class.target.name, "edg_core.test_common.TestPortSink")

        self.assertEqual(pb.blocks['sink1'].hierarchy.self_class.target.name,
                         'edg_core.test_common.TestBlockSink')
        self.assertEqual(
            pb.blocks['sink1'].hierarchy.ports['sink'].port.self_class.target.
            name, 'edg_core.test_common.TestPortSink')
        self.assertEqual(pb.blocks['sink2'].hierarchy.self_class.target.name,
                         'edg_core.test_common.TestBlockSink')
        self.assertEqual(
            pb.blocks['sink2'].hierarchy.ports['sink'].port.self_class.target.
            name, 'edg_core.test_common.TestPortSink')

        self.assertEqual(len(pb.links), 1)
        self.assertEqual(pb.links['test_net'].link.self_class.target.name,
                         'edg_core.test_common.TestLink')
        self.assertEqual(
            pb.links['test_net'].link.ports['source'].port.self_class.target.
            name, "edg_core.test_common.TestPortSource")
        self.assertEqual(
            pb.links['test_net'].link.ports['sinks'].array.ports['0'].port.
            self_class.target.name, "edg_core.test_common.TestPortSink")
        self.assertEqual(
            pb.links['test_net'].link.ports['sinks'].array.ports['1'].port.
            self_class.target.name, "edg_core.test_common.TestPortSink")

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'source'
        expected_conn.connected.block_port.ref.steps.add(
        ).name = '(bridge)source_port'
        expected_conn.connected.block_port.ref.steps.add().name = 'inner_link'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.exported.exterior_port.ref.steps.add(
        ).name = 'source_port'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = '(bridge)source_port'
        expected_conn.exported.internal_block_port.ref.steps.add(
        ).name = 'outer_port'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add().name = '0'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink1'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add().name = '1'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink2'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        self.assertIn(expected_conn, pb.constraints.values())
예제 #22
0
    def process_blocklike(self, path: TransformUtil.Path,
                          block: edgir.BlockLikeTypes) -> None:
        # generate short paths for children first
        short_path = self.short_paths[path]

        if 'error' in block.meta.members.node:
            raise InvalidNetlistBlockException(
                f"attempt to netlist with error block at {path}")
        elif 'abstract' in block.meta.members.node:
            raise InvalidNetlistBlockException(
                f"attempt to netlist with abstract block at {path}")

        if isinstance(block, edgir.HierarchyBlock):
            self.hierarchy[path] = block.self_class.target.name

        # TODO handle mixed net/connect operations
        if isinstance(block, edgir.Link) and 'nets' in block.meta.members.node:
            # Conslidate single-net link ports into just the link
            for name, _ in block.ports.items():
                self.short_paths[path.append_port(name)] = short_path
        else:
            for name, _ in block.ports.items():
                self.short_paths[path.append_port(
                    name)] = short_path.append_port(name)

        for name, _ in block.links.items():
            self.short_paths[path.append_link(name)] = short_path.append_link(
                name)

        main_internal_block_names: List[str] = []
        other_internal_block_names: List[str] = []
        if isinstance(block, edgir.HierarchyBlock):
            main_internal_block_names += [
                block_name for block_name in block.blocks.keys()
                if not block_name.startswith('(bridge)')
                and not block_name.startswith('(adapter)')
            ]
            other_internal_block_names += [
                block_name for block_name in block.blocks.keys()
                if block_name not in main_internal_block_names
            ]

        if len(main_internal_block_names) == 1:
            name = main_internal_block_names[0]
            self.short_paths[path.append_block(name)] = short_path

            for name in other_internal_block_names:
                self.short_paths[path.append_block(
                    name)] = short_path.append_block(name)
        else:
            for name in main_internal_block_names + other_internal_block_names:
                self.short_paths[path.append_block(
                    name)] = short_path.append_block(name)

        if 'nets' in block.meta.members.node:
            # add all-pairs edges
            # list conversion to deal with iterable-once
            flat_ports = list(
                chain(*[
                    flatten_port(path.append_port(name), port)
                    for name, port in block.ports.items()
                ]))
            for src_path in flat_ports:
                for dst_path in flat_ports:
                    if src_path != dst_path:
                        self.edges.setdefault(src_path, []).append(dst_path)

        if 'pinning' in block.meta.members.node:

            # vals = find_constraints({'footprint_name', 'mfr', 'part', 'value', 'refdes_prefix'}, block.constraints.values())
            footprint_name = self.design.get_value(path.to_tuple() +
                                                   ('footprint_name', ))
            mfr = self.design.get_value(path.to_tuple() + ('mfr', ))
            part = self.design.get_value(path.to_tuple() + ('part', ))
            value = self.design.get_value(path.to_tuple() + ('value', ))
            refdes_prefix = self.design.get_value(path.to_tuple() +
                                                  ('refdes_prefix', ))
            lcsc_part = self.design.get_value(path.to_tuple() +
                                              ('lcsc_part', ))

            assert isinstance(footprint_name, str)
            assert isinstance(mfr, str) or mfr is None
            assert isinstance(part, str) or part is None
            assert isinstance(value, str) or value is None
            assert isinstance(lcsc_part, str) or lcsc_part is None
            assert isinstance(refdes_prefix, str)

            part_comps = [part, f"({mfr})" if mfr else ""]
            part_str = " ".join(filter(None, part_comps))
            value_comps = [part_str, value]
            value_str = " - ".join(filter(None, value_comps))

            self.blocks[path] = (
                footprint_name,
                # Uncomment one to set value field
                # TODO this should be a user flag
                value_str
                # lcsc_part or ""
            )

            refdes_id = self.refdes_last.get(refdes_prefix, 0) + 1
            self.refdes_last[refdes_prefix] = refdes_id

            # Uncomment one to set refdes type
            # TODO this should be a user flag
            # self.names[path] = TransformUtil.Path.empty().append_block(refdes_prefix + str(refdes_id))
            self.names[path] = self.short_paths[path]

            for pin_name, pin_path_pb in block.meta.members.node[
                    'pinning'].members.node.items():
                pin_path = path.append_port(pin_name)
                self.pins.add(pin_path)
                self.short_paths[pin_path] = short_path.append_port(pin_name)

                path_value = edgir.ValueExpr().FromString(pin_path_pb.bin_leaf)
                assert path_value.HasField('ref')
                src_path = path.follow(path_value.ref, block)[0]

                # Create a unidirectional edge from the port to the footprint pin
                self.edges.setdefault(src_path, []).append(pin_path)
                self.edges.setdefault(pin_path, [])  # create a dummy entry

                self.names[pin_path] = self.names[path].append_port(pin_name)

        for name, constraint in block.constraints.items():
            if constraint.HasField('connected'):
                self.process_connected(path, block, constraint.connected)
            elif constraint.HasField('exported'):
                self.process_exported(path, block, constraint.exported)
예제 #23
0
    def test_single_hierarchy(self):
        """
    Tests design instantiation with a single level of hierarchy blocks.
    Only tests that the contained blocks are instantiated and structurally correct, does not check internal constraints
    """
        compiled_design = ScalaCompiler.compile(TopHierarchyBlock)
        pb = compiled_design.contents

        self.assertEqual(pb.self_class.target.name,
                         'edg_core.test_hierarchy_block.TopHierarchyBlock')

        self.assertEqual(len(pb.blocks), 3)

        self.assertEqual(pb.blocks['source'].hierarchy.self_class.target.name,
                         'edg_core.test_common.TestBlockSource')
        self.assertEqual(
            pb.blocks['source'].hierarchy.ports['source'].port.self_class.
            target.name, 'edg_core.test_common.TestPortSource')

        self.assertEqual(pb.blocks['sink1'].hierarchy.self_class.target.name,
                         'edg_core.test_common.TestBlockSink')
        self.assertEqual(
            pb.blocks['sink1'].hierarchy.ports['sink'].port.self_class.target.
            name, 'edg_core.test_common.TestPortSink')

        self.assertEqual(pb.blocks['sink2'].hierarchy.self_class.target.name,
                         'edg_core.test_common.TestBlockSink')
        self.assertEqual(
            pb.blocks['sink2'].hierarchy.ports['sink'].port.self_class.target.
            name, 'edg_core.test_common.TestPortSink')

        self.assertEqual(pb.links['test_net'].link.self_class.target.name,
                         'edg_core.test_common.TestLink')
        self.assertEqual(
            pb.links['test_net'].link.ports['source'].port.self_class.target.
            name, "edg_core.test_common.TestPortSource")
        self.assertEqual(
            pb.links['test_net'].link.ports['sinks'].array.ports['0'].port.
            self_class.target.name, "edg_core.test_common.TestPortSink")
        self.assertEqual(
            pb.links['test_net'].link.ports['sinks'].array.ports['1'].port.
            self_class.target.name, "edg_core.test_common.TestPortSink")

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'source'
        expected_conn.connected.block_port.ref.steps.add().name = 'source'
        expected_conn.connected.block_port.ref.steps.add().name = 'source'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add().name = '0'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink1'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        self.assertIn(expected_conn, pb.constraints.values())

        expected_conn = edgir.ValueExpr()
        expected_conn.connected.link_port.ref.steps.add().name = 'test_net'
        expected_conn.connected.link_port.ref.steps.add().name = 'sinks'
        expected_conn.connected.link_port.ref.steps.add().name = '1'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink2'
        expected_conn.connected.block_port.ref.steps.add().name = 'sink'
        self.assertIn(expected_conn, pb.constraints.values())
예제 #24
0
 def refable_to_path_expr(ref: Refable) -> edgir.ValueExpr:
     expr = edgir.ValueExpr()
     expr.ref.CopyFrom(ref_map[ref])
     return expr