48def createMergerBoard(legacyBoard0, legacyBoard1):
49
50 legacyOccupation = [[32*[None],32*[None]],[32*[None],32*[None]]]
51 for boardNumber, board in enumerate([legacyBoard0, legacyBoard1]):
52 for conn in board["connectors"][0]["algorithmGroups"]:
53 fpga = conn['fpga']
54 clock = conn['clock']
55 for topoAlgDef in conn['algorithms']:
56 lines = topoAlgDef.outputlines
57 if len(lines)==1:
58 legacyOccupation[boardNumber][clock][ 16*fpga + topoAlgDef.outputbits] = lines[0]
59 else:
60 for bit,line in enumerate(lines):
61 legacyOccupation[boardNumber][clock][ 16*fpga + bit + topoAlgDef.outputbits[0]] = line
62
63 signals = [32*[None], 32*[None]]
64 for mc in __mapping:
65 for clock in [0,1]:
66 algFromMapping = mc.signals[clock]
67 if algFromMapping is None:
68 continue
69 signals[clock][mc.target_bit] = "R2TOPO_"+algFromMapping
70 algFromLegacyBoardDef = legacyOccupation[mc.topo_board][clock][mc.source_bit]
71 if algFromMapping != algFromLegacyBoardDef:
72 fpga = mc.source_bit // 16
73 bit = mc.source_bit % 16
74 msg = f"Legacy board mapping expects line {algFromMapping} on LegacyBoard{mc.topo_board}, fpga {fpga}, " +\
75 f"clock {clock}, bit {bit} but board defines {algFromLegacyBoardDef}"
76 log.error(msg)
77 raise RuntimeError("Mapping doesn't match LegacyBoard definition")
78
79
80 board = {
81 "type": "merger",
82 "connectors": [{
83 "name" : "LegacyTopoMerged",
84 "format" : "simple",
85 "nbitsDefault" : 1,
86 "type" : "electrical",
87 "legacy" : False,
88 "signalGroups" : [
89 {
90 "clock" : 0,
91 "signals" : signals[0]
92 },
93 {
94 "clock" : 1,
95 "signals" : signals[1]
96 }
97 ]
98 }]
99 }
100 return {"LegacyTopoMerger": board}