Commit 91cd7fac by lvzhengyang

Initial commit

parents
place_parser
-------- aes-mbff --------
num insts: 13996
invalid_cnt / tot_cnt: 0 / 97478, 0.0%
_tray_size2_1123/QN0 -> _29786_/B
_tray_size2_1123/QN0 -> _28899_/B
_tray_size2_1123/QN1 -> _29784_/B
_tray_size2_1123/QN1 -> _28909_/A
_tray_size2_1122/QN0 -> _29789_/B
_tray_size2_1122/QN0 -> _28914_/B
_tray_size4_977/QN3 -> _16611_/A
_tray_size4_977/QN3 -> _16405_/B
_tray_size4_977/QN3 -> _16176_/A
_tray_size2_980/QN1 -> _16637_/A
_tray_size2_980/QN1 -> _16438_/B
_tray_size2_980/QN1 -> _16250_/A
_tray_size4_978/QN1 -> _16605_/A
_tray_size4_978/QN1 -> _16395_/B
_tray_size4_978/QN1 -> _16162_/B
_tray_size4_977/QN2 -> _16608_/A
_tray_size4_977/QN2 -> _16400_/B
_tray_size4_977/QN2 -> _16169_/B
_tray_size4_978/QN3 -> _16614_/A
_tray_size4_978/QN3 -> _16409_/B
_tray_size4_978/QN3 -> _16185_/B
_tray_size4_978/QN2 -> _16618_/A
_tray_size4_978/QN2 -> _16413_/B
_tray_size4_978/QN2 -> _16194_/A
_tray_size4_982/QN1 -> _16621_/A
_tray_size4_982/QN1 -> _16417_/B
_tray_size4_982/QN1 -> _16205_/A
_tray_size4_995/QN3 -> _16624_/A
_tray_size4_995/QN3 -> _16421_/B
_tray_size4_995/QN3 -> _16215_/A
_tray_size4_977/QN0 -> _16627_/A
_tray_size4_977/QN0 -> _16425_/B
_tray_size4_977/QN0 -> _16225_/A
_tray_size2_981/QN0 -> _16630_/A
_tray_size2_981/QN0 -> _16429_/B
_tray_size2_981/QN0 -> _16234_/B
_tray_size2_984/QN0 -> _16634_/A
_tray_size2_984/QN0 -> _16433_/B
_tray_size2_984/QN0 -> _16241_/B
_tray_size2_981/QN1 -> _16640_/A
_tray_size2_981/QN1 -> _16442_/B
_tray_size2_981/QN1 -> _16258_/B
_tray_size4_987/QN1 -> _16643_/A
_tray_size4_987/QN1 -> _16447_/B
_tray_size4_987/QN1 -> _16266_/A
_tray_size2_1038/QN0 -> _16646_/A
_tray_size2_1038/QN0 -> _16451_/B
_tray_size2_1038/QN0 -> _16276_/A
_tray_size2_983/QN1 -> _16650_/A
_tray_size2_983/QN1 -> _16455_/B
_tray_size2_983/QN1 -> _16286_/A
_tray_size2_979/QN1 -> _16653_/A
_tray_size2_979/QN1 -> _16459_/B
_tray_size2_979/QN1 -> _16296_/A
_tray_size4_1000/QN2 -> _16656_/A
_tray_size4_1000/QN2 -> _16463_/B
_tray_size4_1000/QN2 -> _15585_/B
_tray_size4_1107/QN1 -> _16659_/A
_tray_size4_1107/QN1 -> _16467_/B
_tray_size4_1107/QN1 -> _15578_/B
_tray_size4_998/QN1 -> _16662_/A
_tray_size4_998/QN1 -> _16471_/B
_tray_size4_998/QN1 -> _15609_/A
_tray_size4_1028/QN0 -> _16665_/A
_tray_size4_1028/QN0 -> _16475_/B
_tray_size4_1028/QN0 -> _15564_/B
_tray_size4_1011/QN3 -> _16668_/A
_tray_size4_1011/QN3 -> _16480_/B
_tray_size4_1011/QN3 -> _15595_/A
_tray_size4_1028/QN2 -> _16671_/A
_tray_size4_1028/QN2 -> _16484_/B
_tray_size4_1028/QN2 -> _15549_/A
_tray_size4_1106/QN2 -> _16674_/A
_tray_size4_1106/QN2 -> _16489_/B
_tray_size4_1106/QN2 -> _15618_/A
_tray_size4_1004/QN3 -> _16677_/A
_tray_size4_1004/QN3 -> _16493_/B
_tray_size4_1004/QN3 -> _15629_/A
_tray_size4_975/QN0 -> _16302_/B
_tray_size4_1010/QN3 -> _16312_/B
_tray_size4_1013/QN3 -> _16327_/B
_tray_size4_1009/QN1 -> _16338_/B
_tray_size4_975/QN2 -> _16351_/B
_tray_size4_1012/QN2 -> _16362_/B
_tray_size4_1009/QN0 -> _16373_/B
_tray_size4_1019/QN2 -> _16383_/B
_tray_size4_1053/QN0 -> _30051_/B
_tray_size4_1053/QN0 -> _18298_/B
_tray_size4_1053/QN1 -> _30049_/B
_tray_size4_1053/QN1 -> _18358_/B
_tray_size4_1065/QN1 -> _30053_/B
_tray_size4_1065/QN1 -> _18365_/B
_tray_size4_1066/QN0 -> _29981_/B
_tray_size4_1066/QN0 -> _19121_/B
_tray_size4_1078/QN1 -> _29979_/B
_tray_size4_1078/QN1 -> _19174_/B
_tray_size4_1077/QN2 -> _29983_/B
_tray_size4_1077/QN2 -> _19180_/B
_tray_size4_1085/QN3 -> _29911_/B
_tray_size4_1085/QN3 -> _19919_/B
_tray_size4_1097/QN3 -> _29909_/B
_tray_size4_1097/QN3 -> _19973_/B
_tray_size4_1101/QN3 -> _29913_/B
_tray_size4_1101/QN3 -> _19979_/B
_tray_size2_1103/QN0 -> _29841_/B
_tray_size2_1103/QN0 -> _20721_/B
_tray_size2_1104/QN1 -> _29839_/B
_tray_size2_1104/QN1 -> _20775_/B
_tray_size2_1102/QN0 -> _29843_/B
_tray_size2_1102/QN0 -> _20781_/B
_tray_size4_1090/QN2 -> _30034_/B
_tray_size4_1090/QN2 -> _21522_/B
_tray_size4_1067/QN0 -> _30032_/B
_tray_size4_1067/QN0 -> _21556_/B
_tray_size4_1057/QN2 -> _30037_/B
_tray_size4_1057/QN2 -> _21562_/B
_tray_size4_1072/QN0 -> _29963_/B
_tray_size4_1072/QN0 -> _22289_/B
_tray_size4_1089/QN3 -> _29961_/B
_tray_size4_1089/QN3 -> _22324_/A2
_tray_size4_1071/QN0 -> _29966_/B
_tray_size4_1071/QN0 -> _22326_/B
_tray_size4_1091/QN0 -> _29893_/B
_tray_size4_1091/QN0 -> _23049_/B
_tray_size4_1092/QN1 -> _29891_/B
_tray_size4_1092/QN1 -> _23084_/A2
_tray_size4_1090/QN0 -> _29895_/B
_tray_size4_1090/QN0 -> _23086_/B
_tray_size4_1108/QN0 -> _29823_/B
_tray_size4_1108/QN0 -> _23809_/B
_tray_size4_1109/QN3 -> _29821_/B
_tray_size4_1109/QN3 -> _23844_/A2
_tray_size4_1114/QN1 -> _29825_/B
_tray_size4_1114/QN1 -> _23846_/B
_tray_size4_1092/QN2 -> _30017_/B
_tray_size4_1092/QN2 -> _24573_/B
_tray_size4_1059/QN2 -> _30015_/B
_tray_size4_1059/QN2 -> _24581_/B
_tray_size2_1088/QN0 -> _30019_/B
_tray_size2_1088/QN0 -> _24589_/B
_tray_size4_1105/QN3 -> _29946_/B
_tray_size4_1105/QN3 -> _25194_/B
_tray_size4_1074/QN0 -> _29944_/B
_tray_size4_1074/QN0 -> _25202_/B
_tray_size4_1108/QN1 -> _29949_/B
_tray_size4_1108/QN1 -> _25210_/B
_tray_size4_1095/QN0 -> _29875_/B
_tray_size4_1095/QN0 -> _25807_/B
_tray_size4_1096/QN1 -> _29873_/B
_tray_size4_1096/QN1 -> _25815_/B
_tray_size4_1094/QN0 -> _29878_/B
_tray_size4_1094/QN0 -> _25823_/B
_tray_size2_1116/QN0 -> _29804_/B
_tray_size2_1116/QN0 -> _26419_/B
_tray_size2_1117/QN0 -> _29802_/B
_tray_size2_1117/QN0 -> _26427_/B
_tray_size2_1115/QN0 -> _29806_/B
_tray_size2_1115/QN0 -> _26435_/B
_tray_size4_1062/QN0 -> _29999_/B
_tray_size4_1062/QN0 -> _27031_/B
_tray_size4_1063/QN2 -> _29997_/B
_tray_size4_1063/QN2 -> _27041_/A
_tray_size4_1061/QN3 -> _30001_/B
_tray_size4_1061/QN3 -> _27046_/B
_tray_size4_1081/QN2 -> _29929_/B
_tray_size4_1081/QN2 -> _27653_/B
_tray_size4_1082/QN1 -> _29927_/B
_tray_size4_1082/QN1 -> _27663_/A
_tray_size4_1080/QN0 -> _29931_/B
_tray_size4_1080/QN0 -> _27668_/B
_tray_size4_1100/QN3 -> _29858_/B
_tray_size4_1100/QN3 -> _28276_/B
_tray_size4_1101/QN0 -> _29856_/B
_tray_size4_1101/QN0 -> _28286_/A
_tray_size4_1099/QN3 -> _29861_/B
_tray_size4_1099/QN3 -> _28291_/B
_tray_size4_1031/QN0 -> _18599_/B
_tray_size4_1031/QN0 -> _21752_/B
_tray_size4_1031/QN0 -> _24570_/A
_tray_size4_1031/QN0 -> _24599_/A
_tray_size4_1031/QN0 -> _24618_/A
_tray_size4_1031/QN0 -> _24718_/A
_tray_size4_1031/QN0 -> _27039_/B
_tray_size4_1031/QN0 -> _29624_/A
_tray_size2_964/QN1 -> _18596_/A
_tray_size2_964/QN1 -> _21527_/A
_tray_size2_964/QN1 -> _21603_/A
_tray_size2_964/QN1 -> _21665_/A
_tray_size2_964/QN1 -> _21751_/B
_tray_size2_964/QN1 -> _29592_/A
_tray_size4_1009/QN2 -> _29649_/A
_tray_size4_1080/QN3 -> _29652_/A
_tray_size4_1076/QN0 -> _30097_/A1
_tray_size4_1076/QN0 -> _29520_/C
_tray_size4_1076/QN0 -> _15545_/A
_tray_size4_1076/QN2 -> _30097_/A2
_tray_size4_1076/QN2 -> _30093_/A2
_tray_size4_1076/QN2 -> _29519_/A
_tray_size4_1076/QN2 -> _15545_/B
_tray_size4_1052/QN1 -> _30063_/B
_tray_size4_1052/QN1 -> _18604_/B
_tray_size4_1054/QN1 -> _30061_/B
_tray_size4_1054/QN1 -> _18552_/B
_tray_size4_1060/QN1 -> _30059_/B
_tray_size4_1060/QN1 -> _18465_/B
_tray_size4_1077/QN0 -> _30057_/B
_tray_size4_1077/QN0 -> _18488_/B
_tray_size4_1064/QN0 -> _30055_/B
_tray_size4_1064/QN0 -> _18409_/B
_tray_size4_1065/QN0 -> _30047_/B
_tray_size4_1065/QN0 -> _21754_/B
_tray_size4_1054/QN2 -> _30045_/B
_tray_size4_1054/QN2 -> _21709_/B
_tray_size4_1055/QN0 -> _30043_/B
_tray_size4_1055/QN0 -> _21594_/B
_tray_size4_1067/QN1 -> _30041_/B
_tray_size4_1067/QN1 -> _21664_/B
_tray_size4_1056/QN2 -> _30039_/B
_tray_size4_1056/QN2 -> _21599_/B
_tray_size4_1092/QN3 -> _30029_/B
_tray_size4_1092/QN3 -> _24719_/B
_tray_size2_1086/QN0 -> _30027_/B
_tray_size2_1086/QN0 -> _24676_/B
_tray_size4_1094/QN1 -> _30025_/B
_tray_size4_1094/QN1 -> _24647_/B
_tray_size4_1058/QN3 -> _30023_/B
_tray_size4_1058/QN3 -> _24621_/B
_tray_size4_1093/QN2 -> _30021_/B
_tray_size4_1093/QN2 -> _24602_/B
_tray_size4_1063/QN1 -> _30012_/B
_tray_size4_1063/QN1 -> _27175_/B
_tray_size4_1060/QN3 -> _30010_/B
_tray_size4_1060/QN3 -> _27130_/B
_tray_size4_1063/QN3 -> _30007_/B
_tray_size4_1063/QN3 -> _27102_/B
_tray_size4_1079/QN2 -> _30005_/B
_tray_size4_1079/QN2 -> _27079_/B
_tray_size4_1080/QN1 -> _30003_/B
_tray_size4_1080/QN1 -> _27067_/B
_tray_size4_1064/QN1 -> _29995_/B
_tray_size4_1064/QN1 -> _19402_/B
_tray_size4_1064/QN3 -> _29993_/B
_tray_size4_1064/QN3 -> _19354_/B
_tray_size4_1065/QN3 -> _29990_/B
_tray_size4_1065/QN3 -> _19273_/B
_tray_size4_1075/QN0 -> _29988_/B
_tray_size4_1075/QN0 -> _19295_/B
_tray_size4_1082/QN0 -> _29985_/B
_tray_size4_1082/QN0 -> _19221_/B
_tray_size4_1067/QN3 -> _29977_/B
_tray_size4_1067/QN3 -> _22527_/B
_tray_size2_1068/QN1 -> _29975_/B
_tray_size2_1068/QN1 -> _22484_/B
_tray_size4_1072/QN1 -> _29973_/B
_tray_size4_1072/QN1 -> _22359_/B
_tray_size4_1069/QN2 -> _29971_/B
_tray_size4_1069/QN2 -> _22432_/B
_tray_size2_1070/QN0 -> _29968_/B
_tray_size2_1070/QN0 -> _22364_/B
_tray_size4_1073/QN2 -> _29959_/B
_tray_size4_1073/QN2 -> _25333_/B
_tray_size4_1106/QN0 -> _29957_/B
_tray_size4_1106/QN0 -> _25291_/B
_tray_size4_1092/QN0 -> _29955_/B
_tray_size4_1092/QN0 -> _25264_/B
_tray_size4_1105/QN2 -> _29953_/B
_tray_size4_1105/QN2 -> _25239_/B
_tray_size4_1109/QN0 -> _29951_/B
_tray_size4_1109/QN0 -> _25223_/B
_tray_size4_1075/QN1 -> _29941_/B
_tray_size4_1075/QN1 -> _27796_/B
_tray_size4_1076/QN1 -> _29939_/B
_tray_size4_1076/QN1 -> _27752_/B
_tray_size4_1077/QN1 -> _29937_/B
_tray_size4_1077/QN1 -> _27724_/B
_tray_size4_1078/QN0 -> _29935_/B
_tray_size4_1078/QN0 -> _27700_/B
_tray_size4_1079/QN0 -> _29933_/B
_tray_size4_1079/QN0 -> _27689_/B
_tray_size4_1096/QN0 -> _29924_/B
_tray_size4_1096/QN0 -> _20203_/B
_tray_size4_1083/QN1 -> _29922_/B
_tray_size4_1083/QN1 -> _20155_/B
_tray_size4_1119/QN1 -> _29919_/B
_tray_size4_1119/QN1 -> _20072_/B
_tray_size4_1121/QN1 -> _29917_/B
_tray_size4_1121/QN1 -> _20094_/B
_tray_size4_1084/QN2 -> _29915_/B
_tray_size4_1084/QN2 -> _20019_/B
_tray_size2_1086/QN1 -> _29907_/B
_tray_size2_1086/QN1 -> _23287_/B
_tray_size4_1087/QN0 -> _29905_/B
_tray_size4_1087/QN0 -> _23244_/B
_tray_size2_1088/QN1 -> _29902_/B
_tray_size2_1088/QN1 -> _23119_/B
_tray_size4_1089/QN0 -> _29900_/B
_tray_size4_1089/QN0 -> _23192_/B
_tray_size4_1091/QN2 -> _29897_/B
_tray_size4_1091/QN2 -> _23124_/B
_tray_size4_1095/QN3 -> _29889_/B
_tray_size4_1095/QN3 -> _25945_/B
_tray_size4_1093/QN3 -> _29887_/B
_tray_size4_1093/QN3 -> _25903_/B
_tray_size4_1093/QN1 -> _29885_/B
_tray_size4_1093/QN1 -> _25876_/B
_tray_size4_1094/QN3 -> _29883_/B
_tray_size4_1094/QN3 -> _25851_/B
_tray_size4_1095/QN1 -> _29880_/B
_tray_size4_1095/QN1 -> _25835_/B
_tray_size4_1097/QN0 -> _29871_/B
_tray_size4_1097/QN0 -> _28419_/B
_tray_size4_1100/QN2 -> _29869_/B
_tray_size4_1100/QN2 -> _28375_/B
_tray_size4_1099/QN2 -> _29867_/B
_tray_size4_1099/QN2 -> _28347_/B
_tray_size4_1099/QN1 -> _29865_/B
_tray_size4_1099/QN1 -> _28323_/B
_tray_size4_1098/QN1 -> _29863_/B
_tray_size4_1098/QN1 -> _28312_/B
_tray_size2_1104/QN0 -> _29853_/B
_tray_size2_1104/QN0 -> _21005_/B
_tray_size2_1102/QN1 -> _29851_/B
_tray_size2_1102/QN1 -> _20957_/B
_tray_size4_1114/QN2 -> _29849_/B
_tray_size4_1114/QN2 -> _20875_/B
_tray_size2_1117/QN1 -> _29847_/B
_tray_size2_1117/QN1 -> _20897_/B
_tray_size2_1116/QN1 -> _29845_/B
_tray_size2_1116/QN1 -> _20822_/B
_tray_size4_1105/QN0 -> _29836_/B
_tray_size4_1105/QN0 -> _24047_/B
_tray_size4_1106/QN3 -> _29834_/B
_tray_size4_1106/QN3 -> _24004_/B
_tray_size4_1107/QN0 -> _29831_/B
_tray_size4_1107/QN0 -> _23879_/B
_tray_size4_1112/QN0 -> _29829_/B
_tray_size4_1112/QN0 -> _23952_/B
_tray_size4_1108/QN2 -> _29827_/B
_tray_size4_1108/QN2 -> _23884_/B
_tray_size2_1110/QN1 -> _29819_/B
_tray_size2_1110/QN1 -> _26557_/B
_tray_size2_1111/QN0 -> _29817_/B
_tray_size2_1111/QN0 -> _26515_/B
_tray_size4_1112/QN1 -> _29814_/B
_tray_size4_1112/QN1 -> _26488_/B
_tray_size4_1113/QN0 -> _29812_/B
_tray_size4_1113/QN0 -> _26463_/B
_tray_size4_1114/QN0 -> _29808_/B
_tray_size4_1114/QN0 -> _26447_/B
_tray_size4_1119/QN2 -> _29800_/B
_tray_size4_1119/QN2 -> _29042_/B
_tray_size4_1118/QN0 -> _29798_/B
_tray_size4_1118/QN0 -> _28998_/B
_tray_size4_1119/QN3 -> _29796_/B
_tray_size4_1119/QN3 -> _28970_/B
_tray_size2_1120/QN1 -> _29794_/B
_tray_size2_1120/QN1 -> _28946_/B
_tray_size4_1121/QN2 -> _29791_/B
_tray_size4_1121/QN2 -> _28935_/B
_tray_size4_1079/QN1 -> _30099_/A
_tray_size4_1079/QN1 -> _29518_/B
_tray_size4_1051/QN3 -> _29653_/A
_tray_size4_1098/QN2 -> _29654_/A
_tray_size4_1050/QN2 -> _29655_/A
_tray_size4_1121/QN0 -> _29656_/A
_tray_size4_1049/QN3 -> _29657_/A
_tray_size4_1083/QN3 -> _29658_/A
_tray_size4_1048/QN0 -> _29659_/A
_tray_size4_1121/QN3 -> _29660_/A
_tray_size4_1047/QN1 -> _29661_/A
_tray_size4_1046/QN3 -> _29662_/A
_tray_size4_1062/QN2 -> _29663_/A
_tray_size4_1084/QN1 -> _29664_/A
_tray_size4_1085/QN1 -> _29665_/A
_tray_size4_1083/QN2 -> _29666_/A
_tray_size4_1100/QN1 -> _29667_/A
_tray_size4_1045/QN3 -> _29668_/A
_tray_size4_1044/QN0 -> _29669_/A
_tray_size4_1082/QN2 -> _29670_/A
_tray_size4_1080/QN2 -> _29671_/A
_tray_size4_1082/QN3 -> _29672_/A
_tray_size4_1044/QN1 -> _29673_/A
_tray_size4_1078/QN2 -> _29674_/A
_tray_size4_1043/QN1 -> _29675_/A
_tray_size4_1044/QN2 -> _29676_/A
_tray_size4_1079/QN3 -> _29677_/A
_tray_size4_1063/QN0 -> _29678_/A
_tray_size4_1046/QN0 -> _29679_/A
_tray_size4_1062/QN3 -> _29680_/A
_tray_size4_1062/QN1 -> _29681_/A
_tray_size4_1042/QN0 -> _29682_/A
_tray_size4_1041/QN1 -> _29683_/A
_tray_size4_1058/QN1 -> _29684_/A
_tray_size4_1040/QN1 -> _29685_/A
_tray_size4_1039/QN1 -> _29686_/A
_tray_size4_1112/QN2 -> _29687_/A
_tray_size4_1112/QN3 -> _29688_/A
_tray_size4_1113/QN1 -> _29689_/A
_tray_size4_1113/QN2 -> _29690_/A
_tray_size4_1113/QN3 -> _29691_/A
_tray_size4_1040/QN0 -> _29692_/A
_tray_size4_1097/QN1 -> _29693_/A
_tray_size4_1096/QN3 -> _29694_/A
_tray_size4_1096/QN2 -> _29695_/A
_tray_size4_1095/QN2 -> _29696_/A
_tray_size4_1118/QN2 -> _29697_/A
_tray_size2_1038/QN1 -> _29698_/A
_tray_size4_1037/QN3 -> _29699_/A
_tray_size4_1045/QN1 -> _29700_/A
_tray_size4_1036/QN2 -> _29701_/A
_tray_size4_1035/QN3 -> _29702_/A
_tray_size4_1108/QN3 -> _29703_/A
_tray_size4_1036/QN1 -> _29704_/A
_tray_size4_1036/QN0 -> _29705_/A
_tray_size4_1034/QN0 -> _29706_/A
_tray_size4_1106/QN1 -> _29707_/A
_tray_size4_1073/QN3 -> _29708_/A
_tray_size4_1033/QN0 -> _29709_/A
_tray_size4_1035/QN0 -> _29710_/A
_tray_size4_1032/QN0 -> _29711_/A
_tray_size4_1031/QN2 -> _29712_/A
_tray_size4_1060/QN2 -> _29713_/A
_tray_size4_1060/QN0 -> _29714_/A
_tray_size4_1041/QN2 -> _29715_/A
_tray_size2_1030/QN0 -> _29716_/A
_tray_size4_1029/QN0 -> _29717_/A
_tray_size4_1059/QN3 -> _29718_/A
_tray_size4_1028/QN1 -> _29719_/A
_tray_size4_1032/QN3 -> _29720_/A
_tray_size4_1034/QN2 -> _29721_/A
_tray_size4_1109/QN2 -> _29722_/A
_tray_size4_1029/QN2 -> _29723_/A
_tray_size4_1034/QN1 -> _29724_/A
_tray_size2_1030/QN1 -> _29725_/A
_tray_size4_1027/QN3 -> _29726_/A
_tray_size4_1059/QN1 -> _29727_/A
_tray_size4_1059/QN0 -> _29728_/A
_tray_size4_1026/QN1 -> _29729_/A
_tray_size4_1032/QN2 -> _29730_/A
_tray_size4_1105/QN1 -> _29731_/A
_tray_size4_1025/QN1 -> _29732_/A
_tray_size4_1067/QN2 -> _29733_/A
_tray_size2_1068/QN0 -> _29734_/A
_tray_size4_1069/QN0 -> _29735_/A
_tray_size4_1069/QN1 -> _29736_/A
_tray_size2_1024/QN1 -> _29737_/A
_tray_size4_1026/QN0 -> _29738_/A
_tray_size2_1070/QN1 -> _29739_/A
_tray_size4_1055/QN3 -> _29740_/A
_tray_size4_1089/QN1 -> _29741_/A
_tray_size4_1057/QN1 -> _29742_/A
_tray_size4_1057/QN0 -> _29743_/A
_tray_size4_1056/QN0 -> _29744_/A
_tray_size4_1026/QN3 -> _29745_/A
_tray_size2_1023/QN1 -> _29746_/A
_tray_size4_1022/QN0 -> _29747_/A
_tray_size4_1055/QN1 -> _29748_/A
_tray_size2_1021/QN1 -> _29749_/A
_tray_size2_1020/QN0 -> _29750_/A
_tray_size2_1110/QN0 -> _29751_/A
_tray_size2_1020/QN1 -> _29752_/A
_tray_size2_1120/QN0 -> _29753_/A
_tray_size4_1114/QN3 -> _29754_/A
_tray_size2_1021/QN0 -> _29756_/A
_tray_size4_1084/QN3 -> _29757_/A
_tray_size4_1094/QN2 -> _29758_/A
_tray_size4_1100/QN0 -> _29759_/A
_tray_size4_1047/QN3 -> _29760_/A
_tray_size4_1097/QN2 -> _29761_/A
_tray_size4_1118/QN3 -> _29762_/A
_tray_size4_1099/QN0 -> _29763_/A
_tray_size4_1045/QN0 -> _29764_/A
_tray_size4_1019/QN0 -> _29765_/A
_tray_size4_1019/QN1 -> _29766_/A
_tray_size4_1078/QN3 -> _29767_/A
_tray_size4_1081/QN0 -> _29768_/A
_tray_size4_1077/QN3 -> _29769_/A
_tray_size4_1018/QN1 -> _29770_/A
_tray_size4_1066/QN1 -> _29771_/A
_tray_size4_1019/QN3 -> _29772_/A
_tray_size4_1053/QN3 -> _29773_/A
_tray_size4_1065/QN2 -> _29774_/A
_tray_size4_1053/QN2 -> _29775_/A
_tray_size4_1033/QN1 -> _29776_/A
_tray_size4_1017/QN3 -> _29777_/A
_tray_size4_1017/QN2 -> _29778_/A
_tray_size4_1054/QN0 -> _29779_/A
_tray_size4_1016/QN1 -> _29780_/A
_tray_size4_1015/QN0 -> _16301_/A
_tray_size2_1023/QN0 -> _16311_/A
_tray_size2_1014/QN0 -> _16326_/A
_tray_size4_1013/QN1 -> _16337_/A
_tray_size4_1012/QN1 -> _16350_/A
_tray_size4_1011/QN1 -> _16361_/A
_tray_size4_1013/QN0 -> _16372_/A
_tray_size4_1013/QN2 -> _16382_/A
_tray_size4_1041/QN0 -> _20007_/B
_tray_size4_1041/QN0 -> _28420_/A2
_tray_size4_1041/QN0 -> _28376_/A2
_tray_size4_1041/QN0 -> _28898_/A
_tray_size4_1041/QN0 -> _28908_/A
_tray_size4_1041/QN0 -> _28934_/A
_tray_size4_1041/QN0 -> _28919_/A
_tray_size4_1041/QN0 -> _28935_/A
_tray_size4_1041/QN0 -> _28312_/A
_tray_size4_1041/QN0 -> _20019_/A
_tray_size4_1041/QN0 -> _28296_/A
_tray_size4_1041/QN0 -> _24602_/A
_tray_size4_1041/QN0 -> _24676_/A
_tray_size4_1041/QN0 -> _21006_/A2
_tray_size4_1041/QN0 -> _21005_/A
_tray_size4_1041/QN0 -> _20897_/A
_tray_size4_1041/QN0 -> _20957_/A
_tray_size4_1041/QN0 -> _20958_/A2
_tray_size4_1041/QN0 -> _20822_/A
_tray_size4_1041/QN0 -> _23119_/A
_tray_size4_1041/QN0 -> _20073_/A2
_tray_size4_1041/QN0 -> _20072_/A
_tray_size4_1041/QN0 -> _25876_/A
_tray_size4_1041/QN0 -> _20155_/A
_tray_size4_1041/QN0 -> _28347_/A
_tray_size4_1041/QN0 -> _28323_/A
_tray_size4_1041/QN0 -> _28998_/A
_tray_size4_1041/QN0 -> _28970_/A
_tray_size4_1041/QN0 -> _29042_/A
_tray_size4_1041/QN0 -> _20156_/A2
_tray_size4_1041/QN0 -> _26420_/A2
_tray_size4_1041/QN0 -> _26448_/A2
_tray_size4_1041/QN0 -> _20876_/A2
_tray_size4_1041/QN0 -> _23912_/B
_tray_size4_1041/QN0 -> _20923_/B
_tray_size4_1041/QN0 -> _20875_/A
_tray_size4_1041/QN0 -> _26447_/A
_tray_size4_1041/QN0 -> _26464_/A2
_tray_size4_1041/QN0 -> _23993_/B
_tray_size4_1041/QN0 -> _26489_/A2
_tray_size4_1041/QN0 -> _26463_/A
_tray_size4_1041/QN0 -> _26436_/A2
_tray_size4_1041/QN0 -> _20774_/B
_tray_size4_1041/QN0 -> _20809_/B
_tray_size4_1041/QN0 -> _20752_/B
_tray_size4_1041/QN0 -> _26428_/A2
_tray_size4_1041/QN0 -> _28946_/A
_tray_size4_1041/QN0 -> _28947_/A2
_tray_size4_1041/QN0 -> _23826_/B
_tray_size4_1041/QN0 -> _23861_/B
_tray_size4_1041/QN0 -> _26558_/A2
_tray_size4_1041/QN0 -> _26557_/A
_tray_size4_1041/QN0 -> _26515_/A
_tray_size4_1041/QN0 -> _26516_/A2
_tray_size4_1041/QN0 -> _20120_/B
_tray_size4_1041/QN0 -> _25904_/A2
_tray_size4_1041/QN0 -> _25903_/A
_tray_size4_1041/QN0 -> _25877_/A2
_tray_size4_1041/QN0 -> _29043_/A2
_tray_size4_1041/QN0 -> _28971_/A2
_tray_size4_1041/QN0 -> _28999_/A2
_tray_size4_1041/QN0 -> _28348_/A2
_tray_size4_1041/QN0 -> _23287_/A
_tray_size4_1041/QN0 -> _23120_/A2
_tray_size4_1041/QN0 -> _28324_/A2
_tray_size4_1041/QN0 -> _19950_/B
_tray_size4_1041/QN0 -> _28275_/A
_tray_size4_1041/QN0 -> _28285_/A
_tray_size4_1041/QN0 -> _28311_/A
_tray_size4_1041/QN0 -> _19972_/B
_tray_size4_1041/QN0 -> _23066_/B
_tray_size4_1041/QN0 -> _25808_/A2
_tray_size4_1041/QN0 -> _25824_/A2
_tray_size4_1041/QN0 -> _25816_/A2
_tray_size4_1041/QN0 -> _25836_/A2
_tray_size4_1041/QN0 -> _23152_/B
_tray_size4_1041/QN0 -> _25852_/A2
_tray_size4_1041/QN0 -> _23233_/B
_tray_size4_1041/QN0 -> _23288_/A2
_tray_size4_1041/QN0 -> _25946_/A2
_tray_size4_1041/QN0 -> _24647_/A
_tray_size4_1041/QN0 -> _25851_/A
_tray_size4_1041/QN0 -> _25945_/A
_tray_size4_1041/QN0 -> _20203_/A
_tray_size4_1041/QN0 -> _20204_/A2
_tray_size4_1041/QN0 -> _28375_/A
_tray_size4_1041/QN0 -> _20094_/A
_tray_size4_1041/QN0 -> _28419_/A
_tray_size4_1041/QN0 -> _25835_/A
_tray_size4_1041/QN0 -> _27176_/A2
_tray_size4_1041/QN0 -> _27175_/A
_tray_size4_1041/QN0 -> _27080_/A2
_tray_size4_1041/QN0 -> _24621_/A
_tray_size4_1041/QN0 -> _27079_/A
_tray_size4_1041/QN0 -> _27752_/A
_tray_size4_1041/QN0 -> _27051_/A
_tray_size4_1041/QN0 -> _19273_/A
_tray_size4_1041/QN0 -> _21709_/A
_tray_size4_1041/QN0 -> _22527_/A
_tray_size4_1041/QN0 -> _22528_/A2
_tray_size4_1041/QN0 -> _22359_/A
_tray_size4_1041/QN0 -> _22484_/A
_tray_size4_1041/QN0 -> _22364_/A
_tray_size4_1041/QN0 -> _21754_/A
_tray_size4_1041/QN0 -> _21664_/A
_tray_size4_1041/QN0 -> _21594_/A
_tray_size4_1041/QN0 -> _19173_/B
_tray_size4_1041/QN0 -> _19208_/B
_tray_size4_1041/QN0 -> _19152_/B
_tray_size4_1041/QN0 -> _19403_/A2
_tray_size4_1041/QN0 -> _19355_/A2
_tray_size4_1041/QN0 -> _19354_/A
_tray_size4_1041/QN0 -> _27796_/A
_tray_size4_1041/QN0 -> _27700_/A
_tray_size4_1041/QN0 -> _19295_/A
_tray_size4_1041/QN0 -> _19402_/A
_tray_size4_1041/QN0 -> _21755_/A2
_tray_size4_1041/QN0 -> _27725_/A2
_tray_size4_1041/QN0 -> _27724_/A
_tray_size4_1041/QN0 -> _18488_/A
_tray_size4_1041/QN0 -> _18552_/A
_tray_size4_1041/QN0 -> _18553_/A2
_tray_size4_1041/QN0 -> _18409_/A
_tray_size4_1041/QN0 -> _18333_/B
_tray_size4_1041/QN0 -> _18395_/B
_tray_size4_1041/QN0 -> _19274_/A2
_tray_size4_1041/QN0 -> _27652_/A
_tray_size4_1041/QN0 -> _27797_/A2
_tray_size4_1041/QN0 -> _18294_/A
_tray_size4_1041/QN0 -> _27662_/A
_tray_size4_1041/QN0 -> _27701_/A2
_tray_size4_1041/QN0 -> _27688_/A
_tray_size4_1041/QN0 -> _27066_/A
_tray_size4_1041/QN0 -> _27673_/A
_tray_size4_1041/QN0 -> _27067_/A
_tray_size4_1041/QN0 -> _19221_/A
_tray_size4_1041/QN0 -> _24047_/A
_tray_size4_1041/QN0 -> _25240_/A2
_tray_size4_1041/QN0 -> _25239_/A
_tray_size4_1041/QN0 -> _23880_/A2
_tray_size4_1041/QN0 -> _24004_/A
_tray_size4_1041/QN0 -> _23879_/A
_tray_size4_1041/QN0 -> _25211_/A2
_tray_size4_1041/QN0 -> _25195_/A2
_tray_size4_1041/QN0 -> _26488_/A
_tray_size4_1041/QN0 -> _23952_/A
_tray_size4_1041/QN0 -> _23884_/A
_tray_size4_1041/QN0 -> _24005_/A2
_tray_size4_1041/QN0 -> _24048_/A2
_tray_size4_1041/QN0 -> _25265_/A2
_tray_size4_1041/QN0 -> _25264_/A
_tray_size4_1041/QN0 -> _25224_/A2
_tray_size4_1041/QN0 -> _25223_/A
_tray_size4_1041/QN0 -> _25203_/A2
_tray_size4_1041/QN0 -> _23245_/A2
_tray_size4_1041/QN0 -> _23244_/A
_tray_size4_1041/QN0 -> _25334_/A2
_tray_size4_1041/QN0 -> _25292_/A2
_tray_size4_1041/QN0 -> _25291_/A
_tray_size4_1041/QN0 -> _25333_/A
_tray_size4_1041/QN0 -> _24719_/A
_tray_size4_1041/QN0 -> _21577_/B
_tray_size4_1041/QN0 -> _23192_/A
_tray_size4_1041/QN0 -> _22432_/A
_tray_size4_1041/QN0 -> _22473_/B
_tray_size4_1041/QN0 -> _19321_/B
_tray_size4_1041/QN0 -> _22341_/B
_tray_size4_1041/QN0 -> _22360_/A2
_tray_size4_1041/QN0 -> _22485_/A2
_tray_size4_1041/QN0 -> _22392_/B
_tray_size4_1041/QN0 -> _22306_/B
_tray_size4_1041/QN0 -> _18605_/A2
_tray_size4_1041/QN0 -> _18357_/B
_tray_size4_1041/QN0 -> _21539_/B
_tray_size4_1041/QN0 -> _21627_/B
_tray_size4_1041/QN0 -> _23124_/A
_tray_size4_1041/QN0 -> _21599_/A
_tray_size4_1041/QN0 -> _18515_/B
_tray_size4_1041/QN0 -> _24622_/A2
_tray_size4_1041/QN0 -> _24648_/A2
_tray_size4_1041/QN0 -> _18466_/A2
_tray_size4_1041/QN0 -> _21710_/A2
_tray_size4_1041/QN0 -> _24582_/A2
_tray_size4_1041/QN0 -> _24720_/A2
_tray_size4_1041/QN0 -> _24590_/A2
_tray_size4_1041/QN0 -> _24574_/A2
_tray_size4_1041/QN0 -> _24611_/A
_tray_size4_1041/QN0 -> _24677_/A2
_tray_size4_1041/QN0 -> _21595_/A2
_tray_size4_1041/QN0 -> _18604_/A
_tray_size4_1041/QN0 -> _23101_/B
_tray_size4_1041/QN0 -> _27030_/A
_tray_size4_1041/QN0 -> _27040_/A
_tray_size4_1041/QN0 -> _27689_/A
_tray_size4_1041/QN0 -> _27753_/A2
_tray_size4_1041/QN0 -> _27130_/A
_tray_size4_1041/QN0 -> _27102_/A
_tray_size4_1041/QN0 -> _27103_/A2
_tray_size4_1041/QN0 -> _27131_/A2
_tray_size4_1041/QN0 -> _18465_/A
_tray_size4_1009/QN3 -> _30070_/A
_tray_size4_1085/QN2 -> _29617_/A
_tray_size4_1085/QN2 -> _27043_/B
_tray_size4_1085/QN2 -> _27042_/B
_tray_size4_1085/QN2 -> _16605_/B
_tray_size4_1085/QN2 -> _16158_/A
_tray_size4_1008/QN1 -> _29618_/A
_tray_size4_1008/QN1 -> _27034_/B
_tray_size4_1008/QN1 -> _27033_/B
_tray_size4_1008/QN1 -> _16608_/B
_tray_size4_1008/QN1 -> _16165_/A
_tray_size4_1046/QN1 -> _29619_/A
_tray_size4_1046/QN1 -> _27052_/A
_tray_size4_1046/QN1 -> _16611_/B
_tray_size4_1046/QN1 -> _16173_/A
_tray_size4_1007/QN2 -> _29620_/A
_tray_size4_1007/QN2 -> _27069_/B
_tray_size4_1007/QN2 -> _27068_/B
_tray_size4_1007/QN2 -> _16614_/B
_tray_size4_1007/QN2 -> _16181_/A
_tray_size4_1058/QN0 -> _29621_/A
_tray_size4_1058/QN0 -> _27081_/A
_tray_size4_1058/QN0 -> _16618_/B
_tray_size4_1058/QN0 -> _16190_/A
_tray_size4_1006/QN1 -> _29622_/A
_tray_size4_1006/QN1 -> _27104_/A
_tray_size4_1006/QN1 -> _16621_/B
_tray_size4_1006/QN1 -> _16201_/A
_tray_size4_1006/QN0 -> _29623_/A
_tray_size4_1006/QN0 -> _27132_/A
_tray_size4_1006/QN0 -> _16624_/B
_tray_size4_1006/QN0 -> _16211_/A
_tray_size4_1045/QN2 -> _29624_/B
_tray_size4_1045/QN2 -> _27177_/A
_tray_size4_1045/QN2 -> _16627_/B
_tray_size4_1045/QN2 -> _16221_/A
_tray_size2_1005/QN0 -> _29585_/A
_tray_size2_1005/QN0 -> _24583_/A
_tray_size2_1005/QN0 -> _16630_/B
_tray_size2_1005/QN0 -> _16230_/A
_tray_size4_1004/QN1 -> _29586_/A
_tray_size4_1004/QN1 -> _24575_/A
_tray_size4_1004/QN1 -> _16634_/B
_tray_size4_1004/QN1 -> _16237_/A
_tray_size4_1036/QN3 -> _29587_/A
_tray_size4_1036/QN3 -> _24613_/A
_tray_size4_1036/QN3 -> _24591_/A
_tray_size4_1036/QN3 -> _16637_/B
_tray_size4_1036/QN3 -> _16246_/A
_tray_size2_1003/QN1 -> _29588_/A
_tray_size2_1003/QN1 -> _24605_/B
_tray_size2_1003/QN1 -> _16640_/B
_tray_size2_1003/QN1 -> _16255_/A
_tray_size4_1002/QN1 -> _29589_/A
_tray_size4_1002/QN1 -> _24623_/A
_tray_size4_1002/QN1 -> _16643_/B
_tray_size4_1002/QN1 -> _16263_/A
_tray_size2_1001/QN0 -> _29590_/A
_tray_size2_1001/QN0 -> _24649_/A
_tray_size2_1001/QN0 -> _16646_/B
_tray_size2_1001/QN0 -> _16272_/A
_tray_size4_1000/QN0 -> _29591_/A
_tray_size4_1000/QN0 -> _24678_/A
_tray_size4_1000/QN0 -> _16650_/B
_tray_size4_1000/QN0 -> _16282_/A
_tray_size4_1074/QN2 -> _29592_/B
_tray_size4_1074/QN2 -> _24721_/A
_tray_size4_1074/QN2 -> _16653_/B
_tray_size4_1074/QN2 -> _16292_/A
_tray_size4_1089/QN2 -> _29553_/A
_tray_size4_1089/QN2 -> _21559_/B
_tray_size4_1089/QN2 -> _16656_/B
_tray_size4_1089/QN2 -> _15581_/A
_tray_size4_1090/QN1 -> _15573_/A
_tray_size4_1090/QN1 -> _16659_/B
_tray_size4_1090/QN1 -> _21540_/A
_tray_size4_1090/QN1 -> _21551_/B
_tray_size4_1090/QN1 -> _21633_/B
_tray_size4_1090/QN1 -> _21648_/B
_tray_size4_1090/QN1 -> _29554_/A
_tray_size4_999/QN2 -> _15604_/A
_tray_size4_999/QN2 -> _16662_/B
_tray_size4_999/QN2 -> _21574_/B
_tray_size4_999/QN2 -> _21578_/A
_tray_size4_999/QN2 -> _21585_/B
_tray_size4_999/QN2 -> _29555_/A
_tray_size4_1056/QN3 -> _29556_/A
_tray_size4_1056/QN3 -> _21629_/B
_tray_size4_1056/QN3 -> _21614_/A
_tray_size4_1056/QN3 -> _16665_/B
_tray_size4_1056/QN3 -> _15560_/A
_tray_size4_1072/QN3 -> _29557_/A
_tray_size4_1072/QN3 -> _21700_/A
_tray_size4_1072/QN3 -> _21679_/B
_tray_size4_1072/QN3 -> _16668_/B
_tray_size4_1072/QN3 -> _15590_/A
_tray_size4_1073/QN1 -> _29558_/A
_tray_size4_1073/QN1 -> _21596_/A
_tray_size4_1073/QN1 -> _16671_/B
_tray_size4_1073/QN1 -> _15546_/A
_tray_size4_998/QN2 -> _29559_/A
_tray_size4_998/QN2 -> _21711_/A
_tray_size4_998/QN2 -> _16674_/B
_tray_size4_998/QN2 -> _15615_/A
_tray_size4_1025/QN2 -> _29560_/A
_tray_size4_1025/QN2 -> _21756_/A
_tray_size4_1025/QN2 -> _16677_/B
_tray_size4_1025/QN2 -> _15625_/A
_tray_size4_1017/QN0 -> _29521_/A
_tray_size4_1017/QN0 -> _18361_/B
_tray_size4_1017/QN0 -> _18360_/B
_tray_size4_1017/QN0 -> _16301_/B
_tray_size4_1010/QN2 -> _16311_/B
_tray_size4_1010/QN2 -> _18334_/A
_tray_size4_1010/QN2 -> _18342_/B
_tray_size4_1010/QN2 -> _18472_/B
_tray_size4_1010/QN2 -> _29522_/A
_tray_size4_1025/QN3 -> _16326_/B
_tray_size4_1025/QN3 -> _18385_/B
_tray_size4_1025/QN3 -> _18396_/A
_tray_size4_1025/QN3 -> _18404_/B
_tray_size4_1025/QN3 -> _29523_/A
_tray_size4_1064/QN2 -> _16337_/B
_tray_size4_1064/QN2 -> _18436_/B
_tray_size4_1064/QN2 -> _18438_/A
_tray_size4_1064/QN2 -> _18452_/B
_tray_size4_1064/QN2 -> _29524_/A
_tray_size4_1018/QN0 -> _29525_/A
_tray_size4_1018/QN0 -> _18531_/B
_tray_size4_1018/QN0 -> _18517_/A
_tray_size4_1018/QN0 -> _16350_/B
_tray_size4_1012/QN0 -> _29526_/A
_tray_size4_1012/QN0 -> _18467_/A
_tray_size4_1012/QN0 -> _16361_/B
_tray_size4_1054/QN3 -> _29527_/A
_tray_size4_1054/QN3 -> _18554_/A
_tray_size4_1054/QN3 -> _16372_/B
_tray_size4_997/QN0 -> _29528_/A
_tray_size4_997/QN0 -> _18606_/A
_tray_size4_997/QN0 -> _16382_/B
_tray_size4_1047/QN0 -> _29625_/A
_tray_size4_1047/QN0 -> _27665_/B
_tray_size4_1047/QN0 -> _27664_/B
_tray_size4_1047/QN0 -> _16158_/B
_tray_size4_1042/QN1 -> _29626_/A
_tray_size4_1042/QN1 -> _27656_/B
_tray_size4_1042/QN1 -> _27655_/B
_tray_size4_1042/QN1 -> _16165_/B
_tray_size4_996/QN1 -> _29627_/A
_tray_size4_996/QN1 -> _27674_/A
_tray_size4_996/QN1 -> _16173_/B
_tray_size4_1007/QN3 -> _29628_/A
_tray_size4_1007/QN3 -> _27691_/B
_tray_size4_1007/QN3 -> _27690_/B
_tray_size4_1007/QN3 -> _16181_/B
_tray_size4_1058/QN2 -> _29629_/A
_tray_size4_1058/QN2 -> _27702_/A
_tray_size4_1058/QN2 -> _16190_/B
_tray_size4_995/QN0 -> _29630_/A
_tray_size4_995/QN0 -> _27726_/A
_tray_size4_995/QN0 -> _16201_/B
_tray_size4_1031/QN3 -> _29631_/A
_tray_size4_1031/QN3 -> _27754_/A
_tray_size4_1031/QN3 -> _16211_/B
_tray_size4_1101/QN1 -> _29632_/A
_tray_size4_1101/QN1 -> _27798_/A
_tray_size4_1101/QN1 -> _16221_/B
_tray_size2_994/QN1 -> _29593_/A
_tray_size2_994/QN1 -> _25204_/A
_tray_size2_994/QN1 -> _16230_/B
_tray_size4_1004/QN0 -> _29594_/A
_tray_size4_1004/QN0 -> _25196_/A
_tray_size4_1004/QN0 -> _16237_/B
_tray_size4_1107/QN3 -> _29595_/A
_tray_size4_1107/QN3 -> _25228_/B
_tray_size4_1107/QN3 -> _25227_/A
_tray_size4_1107/QN3 -> _25212_/A
_tray_size4_1107/QN3 -> _16246_/B
_tray_size2_1003/QN0 -> _29596_/A
_tray_size2_1003/QN0 -> _25225_/A
_tray_size2_1003/QN0 -> _16255_/B
_tray_size4_1002/QN0 -> _29597_/A
_tray_size4_1002/QN0 -> _25241_/A
_tray_size4_1002/QN0 -> _16263_/B
_tray_size2_993/QN1 -> _29598_/A
_tray_size2_993/QN1 -> _25266_/A
_tray_size2_993/QN1 -> _16272_/B
_tray_size4_998/QN3 -> _29599_/A
_tray_size4_998/QN3 -> _25293_/A
_tray_size4_998/QN3 -> _16282_/B
_tray_size4_1074/QN3 -> _29600_/A
_tray_size4_1074/QN3 -> _25335_/A
_tray_size4_1074/QN3 -> _16292_/B
_tray_size2_992/QN1 -> _29561_/A
_tray_size2_992/QN1 -> _22325_/A
_tray_size2_992/QN1 -> _15581_/B
_tray_size4_1091/QN1 -> _15573_/B
_tray_size4_1091/QN1 -> _22307_/A
_tray_size4_1091/QN1 -> _22318_/B
_tray_size4_1091/QN1 -> _22398_/B
_tray_size4_1091/QN1 -> _22413_/B
_tray_size4_1091/QN1 -> _29562_/A
_tray_size4_999/QN0 -> _15604_/B
_tray_size4_999/QN0 -> _22338_/B
_tray_size4_999/QN0 -> _22342_/A
_tray_size4_999/QN0 -> _22351_/B
_tray_size4_999/QN0 -> _29563_/A
_tray_size4_1069/QN3 -> _29564_/A
_tray_size4_1069/QN3 -> _22394_/B
_tray_size4_1069/QN3 -> _22379_/A
_tray_size4_1069/QN3 -> _15560_/B
_tray_size2_991/QN0 -> _15590_/B
_tray_size2_991/QN0 -> _22447_/B
_tray_size2_991/QN0 -> _22467_/A
_tray_size2_991/QN0 -> _22475_/B
_tray_size2_991/QN0 -> _29565_/A
_tray_size4_1109/QN1 -> _29566_/A
_tray_size4_1109/QN1 -> _22361_/A
_tray_size4_1109/QN1 -> _15546_/B
_tray_size4_1087/QN3 -> _29567_/A
_tray_size4_1087/QN3 -> _22486_/A
_tray_size4_1087/QN3 -> _15615_/B
_tray_size4_1055/QN2 -> _29568_/A
_tray_size4_1055/QN2 -> _22529_/A
_tray_size4_1055/QN2 -> _15625_/B
_tray_size4_1017/QN1 -> _29529_/A
_tray_size4_1017/QN1 -> _19177_/B
_tray_size4_1017/QN1 -> _19176_/B
_tray_size4_1017/QN1 -> _16303_/A
_tray_size4_997/QN2 -> _29530_/A
_tray_size4_997/QN2 -> _19280_/B
_tray_size4_997/QN2 -> _19159_/B
_tray_size4_997/QN2 -> _16313_/A
_tray_size4_1075/QN2 -> _16329_/B
_tray_size4_1075/QN2 -> _19199_/B
_tray_size4_1075/QN2 -> _19209_/A
_tray_size4_1075/QN2 -> _19217_/B
_tray_size4_1075/QN2 -> _29531_/A
_tray_size4_1081/QN1 -> _29532_/A
_tray_size4_1081/QN1 -> _19262_/B
_tray_size4_1081/QN1 -> _19247_/B
_tray_size4_1081/QN1 -> _16339_/A
_tray_size4_1018/QN2 -> _29533_/A
_tray_size4_1018/QN2 -> _19336_/B
_tray_size4_1018/QN2 -> _16352_/A
_tray_size4_1043/QN2 -> _29534_/A
_tray_size4_1043/QN2 -> _16363_/A
_tray_size4_1066/QN2 -> _29535_/A
_tray_size4_1066/QN2 -> _16374_/A
_tray_size4_997/QN3 -> _29536_/A
_tray_size4_997/QN3 -> _16384_/A
_tray_size4_1047/QN2 -> _16160_/A
_tray_size4_1047/QN2 -> _16397_/A1
_tray_size4_1047/QN2 -> _16398_/A1
_tray_size4_1047/QN2 -> _28287_/B
_tray_size4_1047/QN2 -> _28288_/B
_tray_size4_1047/QN2 -> _29633_/A
_tray_size4_1042/QN3 -> _16167_/A
_tray_size4_1042/QN3 -> _16401_/A1
_tray_size4_1042/QN3 -> _16402_/A1
_tray_size4_1042/QN3 -> _28278_/B
_tray_size4_1042/QN3 -> _28279_/B
_tray_size4_1042/QN3 -> _29634_/A
_tray_size4_1046/QN2 -> _29635_/A
_tray_size4_1046/QN2 -> _28297_/A
_tray_size4_1046/QN2 -> _16407_/A1
_tray_size4_1046/QN2 -> _16406_/A1
_tray_size4_1046/QN2 -> _16174_/A
_tray_size4_1084/QN0 -> _16183_/A
_tray_size4_1084/QN0 -> _16410_/A1
_tray_size4_1084/QN0 -> _16411_/A1
_tray_size4_1084/QN0 -> _28313_/B
_tray_size4_1084/QN0 -> _28314_/B
_tray_size4_1084/QN0 -> _29636_/A
_tray_size4_1085/QN0 -> _16192_/A
_tray_size4_1085/QN0 -> _16414_/A1
_tray_size4_1085/QN0 -> _16415_/A1
_tray_size4_1085/QN0 -> _28325_/A
_tray_size4_1085/QN0 -> _29637_/A
_tray_size4_990/QN1 -> _16203_/A
_tray_size4_990/QN1 -> _16418_/A1
_tray_size4_990/QN1 -> _16419_/A1
_tray_size4_990/QN1 -> _28349_/A
_tray_size4_990/QN1 -> _29638_/A
_tray_size4_1049/QN0 -> _16213_/A
_tray_size4_1049/QN0 -> _16422_/A1
_tray_size4_1049/QN0 -> _16423_/A1
_tray_size4_1049/QN0 -> _28377_/A
_tray_size4_1049/QN0 -> _29639_/A
_tray_size4_1007/QN0 -> _16223_/A
_tray_size4_1007/QN0 -> _16426_/A1
_tray_size4_1007/QN0 -> _16427_/A1
_tray_size4_1007/QN0 -> _28421_/A
_tray_size4_1007/QN0 -> _29640_/A
_tray_size2_1005/QN1 -> _16232_/A
_tray_size2_1005/QN1 -> _16430_/A1
_tray_size2_1005/QN1 -> _16431_/A1
_tray_size2_1005/QN1 -> _25817_/A
_tray_size2_1005/QN1 -> _29601_/A
_tray_size4_1035/QN2 -> _16239_/A
_tray_size4_1035/QN2 -> _16435_/A1
_tray_size4_1035/QN2 -> _16436_/A1
_tray_size4_1035/QN2 -> _25809_/A
_tray_size4_1035/QN2 -> _29602_/A
_tray_size4_1107/QN2 -> _16248_/A
_tray_size4_1107/QN2 -> _16439_/A1
_tray_size4_1107/QN2 -> _16440_/A1
_tray_size4_1107/QN2 -> _25825_/A
_tray_size4_1107/QN2 -> _25839_/A
_tray_size4_1107/QN2 -> _25840_/B
_tray_size4_1107/QN2 -> _29603_/A
_tray_size2_1001/QN1 -> _29604_/A
_tray_size2_1001/QN1 -> _25837_/A
_tray_size2_1001/QN1 -> _16444_/A1
_tray_size2_1001/QN1 -> _16443_/A1
_tray_size2_1001/QN1 -> _16256_/A
_tray_size4_1002/QN2 -> _29605_/A
_tray_size4_1002/QN2 -> _25853_/A
_tray_size4_1002/QN2 -> _16449_/A1
_tray_size4_1002/QN2 -> _16448_/A1
_tray_size4_1002/QN2 -> _16264_/A
_tray_size2_993/QN0 -> _16274_/A
_tray_size2_993/QN0 -> _16452_/A1
_tray_size2_993/QN0 -> _16453_/A1
_tray_size2_993/QN0 -> _25878_/A
_tray_size2_993/QN0 -> _29606_/A
_tray_size4_1028/QN3 -> _16284_/A
_tray_size4_1028/QN3 -> _16456_/A1
_tray_size4_1028/QN3 -> _16457_/A1
_tray_size4_1028/QN3 -> _25905_/A
_tray_size4_1028/QN3 -> _29607_/A
_tray_size4_1000/QN1 -> _16294_/A
_tray_size4_1000/QN1 -> _16460_/A1
_tray_size4_1000/QN1 -> _16461_/A1
_tray_size4_1000/QN1 -> _25947_/A
_tray_size4_1000/QN1 -> _29608_/A
_tray_size2_989/QN1 -> _15583_/A
_tray_size2_989/QN1 -> _16464_/A1
_tray_size2_989/QN1 -> _16465_/A1
_tray_size2_989/QN1 -> _23085_/A
_tray_size2_989/QN1 -> _29569_/A
_tray_size4_1091/QN3 -> _15576_/A
_tray_size4_1091/QN3 -> _16468_/A1
_tray_size4_1091/QN3 -> _16469_/A1
_tray_size4_1091/QN3 -> _23067_/A
_tray_size4_1091/QN3 -> _23078_/B
_tray_size4_1091/QN3 -> _23158_/B
_tray_size4_1091/QN3 -> _23173_/B
_tray_size4_1091/QN3 -> _29570_/A
_tray_size4_1057/QN3 -> _15607_/A
_tray_size4_1057/QN3 -> _16472_/A1
_tray_size4_1057/QN3 -> _16473_/A1
_tray_size4_1057/QN3 -> _23098_/B
_tray_size4_1057/QN3 -> _23102_/A
_tray_size4_1057/QN3 -> _23111_/B
_tray_size4_1057/QN3 -> _29571_/A
_tray_size4_1056/QN1 -> _15562_/A
_tray_size4_1056/QN1 -> _16477_/A1
_tray_size4_1056/QN1 -> _16478_/A1
_tray_size4_1056/QN1 -> _23139_/A
_tray_size4_1056/QN1 -> _23154_/B
_tray_size4_1056/QN1 -> _29572_/A
_tray_size2_992/QN0 -> _15593_/A
_tray_size2_992/QN0 -> _16481_/A1
_tray_size2_992/QN0 -> _16482_/A1
_tray_size2_992/QN0 -> _23207_/B
_tray_size2_992/QN0 -> _23227_/A
_tray_size2_992/QN0 -> _23235_/B
_tray_size2_992/QN0 -> _29573_/A
_tray_size4_1073/QN0 -> _29574_/A
_tray_size4_1073/QN0 -> _23121_/A
_tray_size4_1073/QN0 -> _16486_/A1
_tray_size4_1073/QN0 -> _16485_/A1
_tray_size4_1073/QN0 -> _15547_/A
_tray_size4_1087/QN2 -> _29575_/A
_tray_size4_1087/QN2 -> _23246_/A
_tray_size4_1087/QN2 -> _16491_/A1
_tray_size4_1087/QN2 -> _16490_/A1
_tray_size4_1087/QN2 -> _15616_/A
_tray_size4_1025/QN0 -> _15627_/A
_tray_size4_1025/QN0 -> _16494_/A1
_tray_size4_1025/QN0 -> _16495_/A1
_tray_size4_1025/QN0 -> _23289_/A
_tray_size4_1025/QN0 -> _29576_/A
_tray_size4_1093/QN0 -> _16305_/A
_tray_size4_1093/QN0 -> _16497_/A
_tray_size4_1093/QN0 -> _16498_/A2
_tray_size4_1093/QN0 -> _19975_/B
_tray_size4_1093/QN0 -> _19976_/B
_tray_size4_1093/QN0 -> _29537_/A
_tray_size4_990/QN3 -> _16317_/A
_tray_size4_990/QN3 -> _16501_/A
_tray_size4_990/QN3 -> _16502_/A2
_tray_size4_990/QN3 -> _19951_/A
_tray_size4_990/QN3 -> _19958_/B
_tray_size4_990/QN3 -> _20079_/B
_tray_size4_990/QN3 -> _29538_/A
_tray_size4_988/QN1 -> _16324_/A
_tray_size4_988/QN1 -> _16507_/A
_tray_size4_988/QN1 -> _19998_/B
_tray_size4_988/QN1 -> _20015_/B
_tray_size4_988/QN1 -> _29539_/A
_tray_size4_1050/QN1 -> _16343_/A
_tray_size4_1050/QN1 -> _16512_/A
_tray_size4_1050/QN1 -> _16513_/A2
_tray_size4_1050/QN1 -> _20045_/B
_tray_size4_1050/QN1 -> _20047_/A
_tray_size4_1050/QN1 -> _20061_/B
_tray_size4_1050/QN1 -> _29540_/A
_tray_size4_990/QN2 -> _16355_/A
_tray_size4_990/QN2 -> _16516_/A
_tray_size4_990/QN2 -> _16517_/A2
_tray_size4_990/QN2 -> _20122_/A
_tray_size4_990/QN2 -> _20136_/B
_tray_size4_990/QN2 -> _29541_/A
_tray_size4_987/QN2 -> _16366_/A
_tray_size4_987/QN2 -> _16520_/A
_tray_size4_987/QN2 -> _16521_/A2
_tray_size4_987/QN2 -> _20074_/A
_tray_size4_987/QN2 -> _29542_/A
_tray_size4_1119/QN0 -> _29543_/A
_tray_size4_1119/QN0 -> _20157_/A
_tray_size4_1119/QN0 -> _16526_/A2
_tray_size4_1119/QN0 -> _16524_/A
_tray_size4_1119/QN0 -> _16376_/A
_tray_size4_1002/QN3 -> _16387_/A
_tray_size4_1002/QN3 -> _16529_/A
_tray_size4_1002/QN3 -> _16530_/A2
_tray_size4_1002/QN3 -> _20205_/A
_tray_size4_1002/QN3 -> _29544_/A
_tray_size4_986/QN1 -> _29641_/A
_tray_size4_986/QN1 -> _28911_/B
_tray_size4_986/QN1 -> _28910_/B
_tray_size4_986/QN1 -> _16160_/B
_tray_size4_986/QN0 -> _29642_/A
_tray_size4_986/QN0 -> _28902_/B
_tray_size4_986/QN0 -> _28901_/B
_tray_size4_986/QN0 -> _16167_/B
_tray_size4_1050/QN3 -> _29643_/A
_tray_size4_1050/QN3 -> _28920_/A
_tray_size4_1050/QN3 -> _16174_/B
_tray_size4_988/QN2 -> _29644_/A
_tray_size4_988/QN2 -> _28937_/B
_tray_size4_988/QN2 -> _28936_/B
_tray_size4_988/QN2 -> _16183_/B
_tray_size4_1006/QN3 -> _29645_/A
_tray_size4_1006/QN3 -> _28948_/A
_tray_size4_1006/QN3 -> _16192_/B
_tray_size4_986/QN2 -> _29646_/A
_tray_size4_986/QN2 -> _28972_/A
_tray_size4_986/QN2 -> _16203_/B
_tray_size4_1006/QN2 -> _29647_/A
_tray_size4_1006/QN2 -> _29000_/A
_tray_size4_1006/QN2 -> _16213_/B
_tray_size4_1098/QN0 -> _29648_/A
_tray_size4_1098/QN0 -> _29044_/A
_tray_size4_1098/QN0 -> _16223_/B
_tray_size4_985/QN3 -> _29609_/A
_tray_size4_985/QN3 -> _26429_/A
_tray_size4_985/QN3 -> _16232_/B
_tray_size4_985/QN2 -> _29610_/A
_tray_size4_985/QN2 -> _26421_/A
_tray_size4_985/QN2 -> _16239_/B
_tray_size4_985/QN0 -> _29611_/A
_tray_size4_985/QN0 -> _26452_/B
_tray_size4_985/QN0 -> _26451_/A
_tray_size4_985/QN0 -> _26437_/A
_tray_size4_985/QN0 -> _16248_/B
_tray_size2_984/QN1 -> _29612_/A
_tray_size2_984/QN1 -> _26449_/A
_tray_size2_984/QN1 -> _16256_/B
_tray_size4_985/QN1 -> _29613_/A
_tray_size4_985/QN1 -> _26465_/A
_tray_size4_985/QN1 -> _16264_/B
_tray_size2_983/QN0 -> _29614_/A
_tray_size2_983/QN0 -> _26490_/A
_tray_size2_983/QN0 -> _16274_/B
_tray_size4_1000/QN3 -> _29615_/A
_tray_size4_1000/QN3 -> _26517_/A
_tray_size4_1000/QN3 -> _16284_/B
_tray_size4_1004/QN2 -> _29616_/A
_tray_size4_1004/QN2 -> _26559_/A
_tray_size4_1004/QN2 -> _16294_/B
_tray_size4_999/QN3 -> _29577_/A
_tray_size4_999/QN3 -> _23845_/A
_tray_size4_999/QN3 -> _15583_/B
_tray_size4_1011/QN2 -> _15576_/B
_tray_size4_1011/QN2 -> _23827_/A
_tray_size4_1011/QN2 -> _23838_/B
_tray_size4_1011/QN2 -> _23918_/B
_tray_size4_1011/QN2 -> _23933_/B
_tray_size4_1011/QN2 -> _29578_/A
_tray_size4_999/QN1 -> _15607_/B
_tray_size4_999/QN1 -> _23858_/B
_tray_size4_999/QN1 -> _23862_/A
_tray_size4_999/QN1 -> _23871_/B
_tray_size4_999/QN1 -> _29579_/A
_tray_size4_1011/QN0 -> _29580_/A
_tray_size4_1011/QN0 -> _23914_/B
_tray_size4_1011/QN0 -> _23899_/A
_tray_size4_1011/QN0 -> _15562_/B
_tray_size4_1071/QN2 -> _15593_/B
_tray_size4_1071/QN2 -> _23967_/B
_tray_size4_1071/QN2 -> _23987_/A
_tray_size4_1071/QN2 -> _23995_/B
_tray_size4_1071/QN2 -> _29581_/A
_tray_size4_1087/QN1 -> _29582_/A
_tray_size4_1087/QN1 -> _23881_/A
_tray_size4_1087/QN1 -> _15547_/B
_tray_size4_1035/QN1 -> _29583_/A
_tray_size4_1035/QN1 -> _24006_/A
_tray_size4_1035/QN1 -> _15616_/B
_tray_size2_991/QN1 -> _29584_/A
_tray_size2_991/QN1 -> _24049_/A
_tray_size2_991/QN1 -> _15627_/B
_tray_size4_1083/QN0 -> _29545_/A
_tray_size4_1083/QN0 -> _20778_/B
_tray_size4_1083/QN0 -> _20777_/B
_tray_size4_1083/QN0 -> _16305_/B
_tray_size4_982/QN2 -> _16317_/B
_tray_size4_982/QN2 -> _20753_/A
_tray_size4_982/QN2 -> _20760_/B
_tray_size4_982/QN2 -> _20882_/B
_tray_size4_982/QN2 -> _29546_/A
_tray_size4_982/QN3 -> _16324_/B
_tray_size4_982/QN3 -> _20800_/B
_tray_size4_982/QN3 -> _20810_/A
_tray_size4_982/QN3 -> _20818_/B
_tray_size4_982/QN3 -> _29547_/A
_tray_size4_982/QN0 -> _16343_/B
_tray_size4_982/QN0 -> _20848_/B
_tray_size4_982/QN0 -> _20850_/A
_tray_size4_982/QN0 -> _20864_/B
_tray_size4_982/QN0 -> _29548_/A
_tray_size4_990/QN0 -> _29549_/A
_tray_size4_990/QN0 -> _20939_/B
_tray_size4_990/QN0 -> _20925_/A
_tray_size4_990/QN0 -> _16355_/B
_tray_size4_987/QN0 -> _29550_/A
_tray_size4_987/QN0 -> _20877_/A
_tray_size4_987/QN0 -> _16366_/B
_tray_size4_1118/QN1 -> _29551_/A
_tray_size4_1118/QN1 -> _20959_/A
_tray_size4_1118/QN1 -> _16376_/B
_tray_size4_987/QN3 -> _29552_/A
_tray_size4_987/QN3 -> _21007_/A
_tray_size4_987/QN3 -> _16387_/B
_tray_size4_1033/QN3 -> _29521_/B
_tray_size4_1033/QN3 -> _24577_/A
_tray_size4_1033/QN3 -> _21553_/A
_tray_size4_1033/QN3 -> _18306_/A
_tray_size4_1033/QN3 -> _18304_/A
_tray_size4_1033/QN2 -> _18368_/A
_tray_size4_1033/QN2 -> _18371_/A
_tray_size4_1033/QN2 -> _21524_/A
_tray_size4_1033/QN2 -> _21525_/A
_tray_size4_1033/QN2 -> _21531_/A
_tray_size4_1033/QN2 -> _21542_/A
_tray_size4_1033/QN2 -> _21546_/A
_tray_size4_1033/QN2 -> _27048_/B
_tray_size4_1033/QN2 -> _29522_/B
_tray_size4_1016/QN0 -> _18413_/A
_tray_size4_1016/QN0 -> _18415_/A
_tray_size4_1016/QN0 -> _21563_/A
_tray_size4_1016/QN0 -> _21565_/A
_tray_size4_1016/QN0 -> _24585_/A
_tray_size4_1016/QN0 -> _29523_/B
_tray_size4_976/QN0 -> _18492_/A
_tray_size4_976/QN0 -> _21600_/A
_tray_size4_976/QN0 -> _21601_/A
_tray_size4_976/QN0 -> _21607_/A
_tray_size4_976/QN0 -> _21616_/A
_tray_size4_976/QN0 -> _21620_/A
_tray_size4_976/QN0 -> _24597_/A
_tray_size4_976/QN0 -> _29524_/B
_tray_size4_1043/QN3 -> _29525_/B
_tray_size4_1043/QN3 -> _27099_/B
_tray_size4_1043/QN3 -> _21669_/A
_tray_size4_1043/QN3 -> _21667_/B
_tray_size4_1043/QN3 -> _18457_/A
_tray_size4_1012/QN3 -> _29526_/B
_tray_size4_1012/QN3 -> _27127_/B
_tray_size4_1012/QN3 -> _21590_/A
_tray_size4_1012/QN3 -> _18543_/A
_tray_size4_1016/QN2 -> _29527_/B
_tray_size4_1016/QN2 -> _27172_/B
_tray_size4_1016/QN2 -> _21705_/A
_tray_size4_1016/QN2 -> _18593_/A
_tray_size4_1016/QN3 -> _18304_/B
_tray_size4_1016/QN3 -> _18306_/B
_tray_size4_1016/QN3 -> _18344_/A
_tray_size4_1016/QN3 -> _18347_/A
_tray_size4_1016/QN3 -> _18413_/B
_tray_size4_1016/QN3 -> _18415_/B
_tray_size4_1016/QN3 -> _18492_/B
_tray_size4_1016/QN3 -> _21749_/A
_tray_size4_1016/QN3 -> _29528_/B
_tray_size4_975/QN1 -> _29529_/B
_tray_size4_975/QN1 -> _25198_/A
_tray_size4_975/QN1 -> _22320_/A
_tray_size4_975/QN1 -> _19129_/A
_tray_size4_975/QN1 -> _19127_/A
_tray_size4_975/QN3 -> _19183_/A
_tray_size4_975/QN3 -> _19186_/A
_tray_size4_975/QN3 -> _22291_/A
_tray_size4_975/QN3 -> _22292_/A
_tray_size4_975/QN3 -> _22298_/A
_tray_size4_975/QN3 -> _22309_/A
_tray_size4_975/QN3 -> _22313_/A
_tray_size4_975/QN3 -> _27670_/B
_tray_size4_975/QN3 -> _29530_/B
_tray_size4_1075/QN3 -> _19225_/A
_tray_size4_1075/QN3 -> _19227_/A
_tray_size4_1075/QN3 -> _22327_/A
_tray_size4_1075/QN3 -> _22329_/A
_tray_size4_1075/QN3 -> _25206_/A
_tray_size4_1075/QN3 -> _29531_/B
_tray_size4_1081/QN3 -> _19299_/A
_tray_size4_1081/QN3 -> _22365_/A
_tray_size4_1081/QN3 -> _22366_/A
_tray_size4_1081/QN3 -> _22372_/A
_tray_size4_1081/QN3 -> _22381_/A
_tray_size4_1081/QN3 -> _22385_/A
_tray_size4_1081/QN3 -> _25217_/A
_tray_size4_1081/QN3 -> _29532_/B
_tray_size4_1018/QN3 -> _29533_/B
_tray_size4_1018/QN3 -> _27721_/B
_tray_size4_1018/QN3 -> _22437_/A
_tray_size4_1018/QN3 -> _22435_/B
_tray_size4_1018/QN3 -> _19267_/A
_tray_size4_1043/QN0 -> _29534_/B
_tray_size4_1043/QN0 -> _27749_/B
_tray_size4_1043/QN0 -> _22355_/A
_tray_size4_1043/QN0 -> _19348_/A
_tray_size4_1066/QN3 -> _29535_/B
_tray_size4_1066/QN3 -> _27793_/B
_tray_size4_1066/QN3 -> _22480_/A
_tray_size4_1066/QN3 -> _19395_/A
_tray_size4_997/QN1 -> _19127_/B
_tray_size4_997/QN1 -> _19129_/B
_tray_size4_997/QN1 -> _19161_/A
_tray_size4_997/QN1 -> _19164_/A
_tray_size4_997/QN1 -> _19225_/B
_tray_size4_997/QN1 -> _19227_/B
_tray_size4_997/QN1 -> _19299_/B
_tray_size4_997/QN1 -> _22523_/A
_tray_size4_997/QN1 -> _29536_/B
_tray_size4_1098/QN3 -> _29537_/B
_tray_size4_1098/QN3 -> _25811_/A
_tray_size4_1098/QN3 -> _23080_/A
_tray_size4_1098/QN3 -> _19927_/A
_tray_size4_1098/QN3 -> _19925_/A
_tray_size4_988/QN0 -> _19982_/A
_tray_size4_988/QN0 -> _19985_/A
_tray_size4_988/QN0 -> _23051_/A
_tray_size4_988/QN0 -> _23052_/A
_tray_size4_988/QN0 -> _23058_/A
_tray_size4_988/QN0 -> _23069_/A
_tray_size4_988/QN0 -> _23073_/A
_tray_size4_988/QN0 -> _28293_/B
_tray_size4_988/QN0 -> _29538_/B
_tray_size4_1101/QN2 -> _20023_/A
_tray_size4_1101/QN2 -> _20025_/A
_tray_size4_1101/QN2 -> _23087_/A
_tray_size4_1101/QN2 -> _23089_/A
_tray_size4_1101/QN2 -> _25819_/A
_tray_size4_1101/QN2 -> _29539_/B
_tray_size2_1122/QN1 -> _20098_/A
_tray_size2_1122/QN1 -> _23125_/A
_tray_size2_1122/QN1 -> _23126_/A
_tray_size2_1122/QN1 -> _23132_/A
_tray_size2_1122/QN1 -> _23141_/A
_tray_size2_1122/QN1 -> _23145_/A
_tray_size2_1122/QN1 -> _25830_/A
_tray_size2_1122/QN1 -> _29540_/B
_tray_size4_1051/QN1 -> _29541_/B
_tray_size4_1051/QN1 -> _28344_/B
_tray_size4_1051/QN1 -> _23197_/A
_tray_size4_1051/QN1 -> _23195_/B
_tray_size4_1051/QN1 -> _20066_/A
_tray_size4_977/QN1 -> _29542_/B
_tray_size4_977/QN1 -> _28372_/B
_tray_size4_977/QN1 -> _23115_/A
_tray_size4_977/QN1 -> _20148_/A
_tray_size4_978/QN0 -> _29543_/B
_tray_size4_978/QN0 -> _28416_/B
_tray_size4_978/QN0 -> _23240_/A
_tray_size4_978/QN0 -> _20196_/A
_tray_size4_988/QN3 -> _19925_/B
_tray_size4_988/QN3 -> _19927_/B
_tray_size4_988/QN3 -> _19960_/A
_tray_size4_988/QN3 -> _19963_/A
_tray_size4_988/QN3 -> _20023_/B
_tray_size4_988/QN3 -> _20025_/B
_tray_size4_988/QN3 -> _20098_/B
_tray_size4_988/QN3 -> _23283_/A
_tray_size4_988/QN3 -> _29544_/B
_tray_size2_994/QN0 -> _29545_/B
_tray_size2_994/QN0 -> _26423_/A
_tray_size2_994/QN0 -> _23840_/A
_tray_size2_994/QN0 -> _20729_/A
_tray_size2_994/QN0 -> _20727_/A
_tray_size4_1040/QN2 -> _20784_/A
_tray_size4_1040/QN2 -> _20787_/A
_tray_size4_1040/QN2 -> _23811_/A
_tray_size4_1040/QN2 -> _23812_/A
_tray_size4_1040/QN2 -> _23818_/A
_tray_size4_1040/QN2 -> _23829_/A
_tray_size4_1040/QN2 -> _23833_/A
_tray_size4_1040/QN2 -> _28916_/B
_tray_size4_1040/QN2 -> _29546_/B
_tray_size2_974/QN0 -> _20826_/A
_tray_size2_974/QN0 -> _20828_/A
_tray_size2_974/QN0 -> _23847_/A
_tray_size2_974/QN0 -> _23849_/A
_tray_size2_974/QN0 -> _26431_/A
_tray_size2_974/QN0 -> _29547_/B
_tray_size2_973/QN1 -> _20901_/A
_tray_size2_973/QN1 -> _23885_/A
_tray_size2_973/QN1 -> _23886_/A
_tray_size2_973/QN1 -> _23892_/A
_tray_size2_973/QN1 -> _23901_/A
_tray_size2_973/QN1 -> _23905_/A
_tray_size2_973/QN1 -> _26442_/A
_tray_size2_973/QN1 -> _29548_/B
_tray_size4_1040/QN3 -> _29549_/B
_tray_size4_1040/QN3 -> _28967_/B
_tray_size4_1040/QN3 -> _23957_/A
_tray_size4_1040/QN3 -> _23955_/B
_tray_size4_1040/QN3 -> _20869_/A
_tray_size2_972/QN1 -> _29550_/B
_tray_size2_972/QN1 -> _28995_/B
_tray_size2_972/QN1 -> _23875_/A
_tray_size2_972/QN1 -> _20951_/A
_tray_size2_1115/QN1 -> _29551_/B
_tray_size2_1115/QN1 -> _29039_/B
_tray_size2_1115/QN1 -> _24000_/A
_tray_size2_1115/QN1 -> _20998_/A
_tray_size2_974/QN1 -> _20727_/B
_tray_size2_974/QN1 -> _20729_/B
_tray_size2_974/QN1 -> _20762_/A
_tray_size2_974/QN1 -> _20765_/A
_tray_size2_974/QN1 -> _20826_/B
_tray_size2_974/QN1 -> _20828_/B
_tray_size2_974/QN1 -> _20901_/B
_tray_size2_974/QN1 -> _24043_/A
_tray_size2_974/QN1 -> _29552_/B
_tray_size4_1029/QN3 -> _20725_/A
_tray_size4_1029/QN3 -> _20730_/A
_tray_size4_1029/QN3 -> _20763_/A
_tray_size4_1029/QN3 -> _20764_/A
_tray_size4_1029/QN3 -> _20769_/A
_tray_size4_1029/QN3 -> _26423_/B
_tray_size4_1029/QN3 -> _28905_/B
_tray_size4_1029/QN3 -> _29577_/B
_tray_size4_998/QN0 -> _20733_/A
_tray_size4_998/QN0 -> _20737_/B
_tray_size4_998/QN0 -> _20743_/B
_tray_size4_998/QN0 -> _20784_/B
_tray_size4_998/QN0 -> _20787_/B
_tray_size4_998/QN0 -> _23847_/B
_tray_size4_998/QN0 -> _23849_/B
_tray_size4_998/QN0 -> _29578_/B
_tray_size4_1027/QN2 -> _20785_/A
_tray_size4_1027/QN2 -> _20786_/A
_tray_size4_1027/QN2 -> _20793_/A
_tray_size4_1027/QN2 -> _20801_/A
_tray_size4_1027/QN2 -> _20805_/A
_tray_size4_1027/QN2 -> _20824_/A
_tray_size4_1027/QN2 -> _20829_/A
_tray_size4_1027/QN2 -> _26431_/B
_tray_size4_1027/QN2 -> _29579_/B
_tray_size4_1032/QN1 -> _20832_/A
_tray_size4_1032/QN1 -> _20836_/B
_tray_size4_1032/QN1 -> _20899_/A
_tray_size4_1032/QN1 -> _20903_/A
_tray_size4_1032/QN1 -> _26442_/B
_tray_size4_1032/QN1 -> _29580_/B
_tray_size4_1029/QN1 -> _29581_/B
_tray_size4_1029/QN1 -> _23875_/B
_tray_size4_1029/QN1 -> _20919_/A
_tray_size4_1029/QN1 -> _20906_/A
_tray_size4_1029/QN1 -> _20869_/B
_tray_size4_1090/QN3 -> _29582_/B
_tray_size4_1090/QN3 -> _24000_/B
_tray_size4_1090/QN3 -> _20951_/B
_tray_size4_1090/QN3 -> _20870_/B
_tray_size4_1074/QN1 -> _29583_/B
_tray_size4_1074/QN1 -> _24043_/B
_tray_size4_1074/QN1 -> _20998_/B
_tray_size4_1074/QN1 -> _20952_/B
_tray_size2_989/QN0 -> _20725_/B
_tray_size2_989/QN0 -> _20730_/B
_tray_size2_989/QN0 -> _20762_/B
_tray_size2_989/QN0 -> _20765_/B
_tray_size2_989/QN0 -> _20824_/B
_tray_size2_989/QN0 -> _20829_/B
_tray_size2_989/QN0 -> _20899_/B
_tray_size2_989/QN0 -> _20903_/B
_tray_size2_989/QN0 -> _20999_/B
_tray_size2_989/QN0 -> _29584_/B
_tray_size2_989/QN0 -> _23840_/B
_tray_size4_1026/QN2 -> _18302_/A
_tray_size4_1026/QN2 -> _18307_/A
_tray_size4_1026/QN2 -> _18345_/A
_tray_size4_1026/QN2 -> _18346_/A
_tray_size4_1026/QN2 -> _18351_/A
_tray_size4_1026/QN2 -> _24577_/B
_tray_size4_1026/QN2 -> _27037_/B
_tray_size4_1026/QN2 -> _29553_/B
_tray_size4_971/QN1 -> _18310_/A
_tray_size4_971/QN1 -> _18314_/B
_tray_size4_971/QN1 -> _18320_/B
_tray_size4_971/QN1 -> _18368_/B
_tray_size4_971/QN1 -> _18371_/B
_tray_size4_971/QN1 -> _21563_/B
_tray_size4_971/QN1 -> _21565_/B
_tray_size4_971/QN1 -> _29554_/B
_tray_size4_971/QN0 -> _18369_/A
_tray_size4_971/QN0 -> _18370_/A
_tray_size4_971/QN0 -> _18377_/A
_tray_size4_971/QN0 -> _18386_/A
_tray_size4_971/QN0 -> _18390_/A
_tray_size4_971/QN0 -> _18411_/A
_tray_size4_971/QN0 -> _18416_/A
_tray_size4_971/QN0 -> _24585_/B
_tray_size4_971/QN0 -> _29555_/B
_tray_size4_1015/QN1 -> _18419_/A
_tray_size4_1015/QN1 -> _18423_/B
_tray_size4_1015/QN1 -> _18490_/A
_tray_size4_1015/QN1 -> _18494_/A
_tray_size4_1015/QN1 -> _24597_/B
_tray_size4_1015/QN1 -> _29556_/B
_tray_size4_1072/QN2 -> _29557_/B
_tray_size4_1072/QN2 -> _21590_/B
_tray_size4_1072/QN2 -> _18509_/A
_tray_size4_1072/QN2 -> _18497_/A
_tray_size4_1072/QN2 -> _18457_/B
_tray_size4_1071/QN1 -> _29558_/B
_tray_size4_1071/QN1 -> _21705_/B
_tray_size4_1071/QN1 -> _18543_/B
_tray_size4_1071/QN1 -> _18458_/B
_tray_size4_1015/QN3 -> _29559_/B
_tray_size4_1015/QN3 -> _21749_/B
_tray_size4_1015/QN3 -> _18593_/B
_tray_size4_1015/QN3 -> _18544_/B
_tray_size2_1014/QN1 -> _18302_/B
_tray_size2_1014/QN1 -> _18307_/B
_tray_size2_1014/QN1 -> _18344_/B
_tray_size2_1014/QN1 -> _18347_/B
_tray_size2_1014/QN1 -> _18416_/B
_tray_size2_1014/QN1 -> _18490_/B
_tray_size2_1014/QN1 -> _18494_/B
_tray_size2_1014/QN1 -> _18594_/B
_tray_size2_1014/QN1 -> _21553_/B
_tray_size2_1014/QN1 -> _29560_/B
_tray_size2_1014/QN1 -> _18411_/B
_tray_size4_971/QN2 -> _19125_/A
_tray_size4_971/QN2 -> _19130_/A
_tray_size4_971/QN2 -> _19162_/A
_tray_size4_971/QN2 -> _19163_/A
_tray_size4_971/QN2 -> _19168_/A
_tray_size4_971/QN2 -> _25198_/B
_tray_size4_971/QN2 -> _27659_/B
_tray_size4_971/QN2 -> _29561_/B
_tray_size4_1015/QN2 -> _19133_/A
_tray_size4_1015/QN2 -> _19137_/B
_tray_size4_1015/QN2 -> _19143_/B
_tray_size4_1015/QN2 -> _19183_/B
_tray_size4_1015/QN2 -> _19186_/B
_tray_size4_1015/QN2 -> _22327_/B
_tray_size4_1015/QN2 -> _22329_/B
_tray_size4_1015/QN2 -> _29562_/B
_tray_size2_1024/QN0 -> _19184_/A
_tray_size2_1024/QN0 -> _19185_/A
_tray_size2_1024/QN0 -> _19192_/A
_tray_size2_1024/QN0 -> _19200_/A
_tray_size2_1024/QN0 -> _19204_/A
_tray_size2_1024/QN0 -> _19223_/A
_tray_size2_1024/QN0 -> _19228_/A
_tray_size2_1024/QN0 -> _25206_/B
_tray_size2_1024/QN0 -> _29563_/B
_tray_size4_1071/QN3 -> _19231_/A
_tray_size4_1071/QN3 -> _19235_/B
_tray_size4_1071/QN3 -> _19297_/A
_tray_size4_1071/QN3 -> _19301_/A
_tray_size4_1071/QN3 -> _25217_/B
_tray_size4_1071/QN3 -> _29564_/B
_tray_size4_1022/QN2 -> _29565_/B
_tray_size4_1022/QN2 -> _22355_/B
_tray_size4_1022/QN2 -> _19317_/A
_tray_size4_1022/QN2 -> _19304_/A
_tray_size4_1022/QN2 -> _19267_/B
_tray_size4_1022/QN3 -> _29566_/B
_tray_size4_1022/QN3 -> _22480_/B
_tray_size4_1022/QN3 -> _19348_/B
_tray_size4_1022/QN3 -> _19268_/B
_tray_size4_971/QN3 -> _29567_/B
_tray_size4_971/QN3 -> _22523_/B
_tray_size4_971/QN3 -> _19395_/B
_tray_size4_971/QN3 -> _19349_/B
_tray_size4_1022/QN1 -> _19125_/B
_tray_size4_1022/QN1 -> _19130_/B
_tray_size4_1022/QN1 -> _19161_/B
_tray_size4_1022/QN1 -> _19164_/B
_tray_size4_1022/QN1 -> _19223_/B
_tray_size4_1022/QN1 -> _19228_/B
_tray_size4_1022/QN1 -> _19297_/B
_tray_size4_1022/QN1 -> _19301_/B
_tray_size4_1022/QN1 -> _19396_/B
_tray_size4_1022/QN1 -> _29568_/B
_tray_size4_1022/QN1 -> _22320_/B
_tray_size4_970/QN2 -> _19923_/A
_tray_size4_970/QN2 -> _19928_/A
_tray_size4_970/QN2 -> _19961_/A
_tray_size4_970/QN2 -> _19962_/A
_tray_size4_970/QN2 -> _19967_/A
_tray_size4_970/QN2 -> _25811_/B
_tray_size4_970/QN2 -> _28282_/B
_tray_size4_970/QN2 -> _29569_/B
_tray_size2_969/QN0 -> _19931_/A
_tray_size2_969/QN0 -> _19935_/B
_tray_size2_969/QN0 -> _19941_/B
_tray_size2_969/QN0 -> _19982_/B
_tray_size2_969/QN0 -> _19985_/B
_tray_size2_969/QN0 -> _23087_/B
_tray_size2_969/QN0 -> _23089_/B
_tray_size2_969/QN0 -> _29570_/B
_tray_size4_970/QN0 -> _19983_/A
_tray_size4_970/QN0 -> _19984_/A
_tray_size4_970/QN0 -> _19991_/A
_tray_size4_970/QN0 -> _19999_/A
_tray_size4_970/QN0 -> _20003_/A
_tray_size4_970/QN0 -> _20021_/A
_tray_size4_970/QN0 -> _20026_/A
_tray_size4_970/QN0 -> _25819_/B
_tray_size4_970/QN0 -> _29571_/B
_tray_size4_970/QN3 -> _20029_/A
_tray_size4_970/QN3 -> _20033_/B
_tray_size4_970/QN3 -> _20096_/A
_tray_size4_970/QN3 -> _20100_/A
_tray_size4_970/QN3 -> _25830_/B
_tray_size4_970/QN3 -> _29572_/B
_tray_size2_980/QN0 -> _29573_/B
_tray_size2_980/QN0 -> _23115_/B
_tray_size2_980/QN0 -> _20116_/A
_tray_size2_980/QN0 -> _20103_/A
_tray_size2_980/QN0 -> _20066_/B
_tray_size4_1034/QN3 -> _29574_/B
_tray_size4_1034/QN3 -> _23240_/B
_tray_size4_1034/QN3 -> _20148_/B
_tray_size4_1034/QN3 -> _20067_/B
_tray_size2_972/QN0 -> _29575_/B
_tray_size2_972/QN0 -> _23283_/B
_tray_size2_972/QN0 -> _20196_/B
_tray_size2_972/QN0 -> _20149_/B
_tray_size2_969/QN1 -> _19923_/B
_tray_size2_969/QN1 -> _19928_/B
_tray_size2_969/QN1 -> _19960_/B
_tray_size2_969/QN1 -> _19963_/B
_tray_size2_969/QN1 -> _20021_/B
_tray_size2_969/QN1 -> _20026_/B
_tray_size2_969/QN1 -> _20096_/B
_tray_size2_969/QN1 -> _20100_/B
_tray_size2_969/QN1 -> _20197_/B
_tray_size2_969/QN1 -> _29576_/B
_tray_size2_969/QN1 -> _23080_/B
_tray_size4_1048/QN1 -> _29601_/B
_tray_size4_1048/QN1 -> _28283_/B
_tray_size4_1048/QN1 -> _23054_/A
_tray_size4_1048/QN1 -> _19968_/A
_tray_size4_1048/QN1 -> _19965_/B
_tray_size4_968/QN2 -> _19937_/A
_tray_size4_968/QN2 -> _19945_/C
_tray_size4_968/QN2 -> _19955_/B
_tray_size4_968/QN2 -> _23060_/B
_tray_size4_968/QN2 -> _23062_/C
_tray_size4_968/QN2 -> _23088_/A
_tray_size4_968/QN2 -> _29602_/B
_tray_size4_968/QN0 -> _19988_/A
_tray_size4_968/QN0 -> _19992_/B
_tray_size4_968/QN0 -> _20001_/B
_tray_size4_968/QN0 -> _23128_/A
_tray_size4_968/QN0 -> _28294_/B
_tray_size4_968/QN0 -> _29603_/B
_tray_size4_968/QN3 -> _20035_/A
_tray_size4_968/QN3 -> _23147_/C
_tray_size4_968/QN3 -> _23148_/B
_tray_size4_968/QN3 -> _23193_/A
_tray_size4_968/QN3 -> _28309_/B
_tray_size4_968/QN3 -> _29604_/B
_tray_size4_1037/QN1 -> _20110_/A
_tray_size4_1037/QN1 -> _20117_/B
_tray_size4_1037/QN1 -> _23231_/C
_tray_size4_1037/QN1 -> _25873_/B
_tray_size4_1037/QN1 -> _29605_/B
_tray_size2_979/QN0 -> _29606_/B
_tray_size2_979/QN0 -> _28345_/B
_tray_size2_979/QN0 -> _25900_/B
_tray_size2_979/QN0 -> _23117_/B
_tray_size2_979/QN0 -> _20068_/A
_tray_size4_1037/QN0 -> _29607_/B
_tray_size4_1037/QN0 -> _25942_/B
_tray_size4_1037/QN0 -> _23242_/B
_tray_size4_1037/QN0 -> _20150_/A
_tray_size4_968/QN1 -> _20199_/A
_tray_size4_968/QN1 -> _23054_/B
_tray_size4_968/QN1 -> _23128_/B
_tray_size4_968/QN1 -> _23193_/B
_tray_size4_968/QN1 -> _23285_/B
_tray_size4_968/QN1 -> _29608_/B
_tray_size2_973/QN0 -> _29609_/B
_tray_size2_973/QN0 -> _28906_/B
_tray_size2_973/QN0 -> _23814_/A
_tray_size2_973/QN0 -> _20770_/A
_tray_size2_973/QN0 -> _20767_/B
_tray_size4_1039/QN2 -> _20739_/A
_tray_size4_1039/QN2 -> _20747_/C
_tray_size4_1039/QN2 -> _20757_/B
_tray_size4_1039/QN2 -> _23820_/B
_tray_size4_1039/QN2 -> _23822_/C
_tray_size4_1039/QN2 -> _23848_/A
_tray_size4_1039/QN2 -> _29610_/B
_tray_size4_1039/QN0 -> _20790_/A
_tray_size4_1039/QN0 -> _20794_/B
_tray_size4_1039/QN0 -> _20803_/B
_tray_size4_1039/QN0 -> _23888_/A
_tray_size4_1039/QN0 -> _28917_/B
_tray_size4_1039/QN0 -> _29611_/B
_tray_size4_1039/QN3 -> _20838_/A
_tray_size4_1039/QN3 -> _23907_/C
_tray_size4_1039/QN3 -> _23908_/B
_tray_size4_1039/QN3 -> _23953_/A
_tray_size4_1039/QN3 -> _28932_/B
_tray_size4_1039/QN3 -> _29612_/B
_tray_size4_967/QN2 -> _20913_/A
_tray_size4_967/QN2 -> _20920_/B
_tray_size4_967/QN2 -> _23991_/C
_tray_size4_967/QN2 -> _26485_/B
_tray_size4_967/QN2 -> _29613_/B
_tray_size4_967/QN0 -> _29614_/B
_tray_size4_967/QN0 -> _28968_/B
_tray_size4_967/QN0 -> _26512_/B
_tray_size4_967/QN0 -> _23877_/B
_tray_size4_967/QN0 -> _20871_/A
_tray_size4_967/QN1 -> _29615_/B
_tray_size4_967/QN1 -> _26554_/B
_tray_size4_967/QN1 -> _24002_/B
_tray_size4_967/QN1 -> _20953_/A
_tray_size4_967/QN3 -> _21001_/A
_tray_size4_967/QN3 -> _23814_/B
_tray_size4_967/QN3 -> _23888_/B
_tray_size4_967/QN3 -> _23953_/B
_tray_size4_967/QN3 -> _24045_/B
_tray_size4_967/QN3 -> _29616_/B
_tray_size4_976/QN1 -> _29585_/B
_tray_size4_976/QN1 -> _27038_/B
_tray_size4_976/QN1 -> _21527_/B
_tray_size4_976/QN1 -> _18352_/A
_tray_size4_976/QN1 -> _18349_/B
_tray_size2_966/QN1 -> _18316_/A
_tray_size2_966/QN1 -> _18324_/C
_tray_size2_966/QN1 -> _18338_/B
_tray_size2_966/QN1 -> _21533_/B
_tray_size2_966/QN1 -> _21535_/C
_tray_size2_966/QN1 -> _21564_/A
_tray_size2_966/QN1 -> _29586_/B
_tray_size2_966/QN0 -> _18374_/A
_tray_size2_966/QN0 -> _18378_/B
_tray_size2_966/QN0 -> _18388_/B
_tray_size2_966/QN0 -> _21603_/B
_tray_size2_966/QN0 -> _27049_/B
_tray_size2_966/QN0 -> _29587_/B
_tray_size4_976/QN3 -> _18425_/A
_tray_size4_976/QN3 -> _21622_/C
_tray_size4_976/QN3 -> _21623_/B
_tray_size4_976/QN3 -> _21665_/B
_tray_size4_976/QN3 -> _27064_/B
_tray_size4_976/QN3 -> _29588_/B
_tray_size2_965/QN1 -> _29589_/B
_tray_size2_965/QN1 -> _24644_/B
_tray_size2_965/QN1 -> _18510_/B
_tray_size2_965/QN1 -> _18503_/A
_tray_size4_976/QN2 -> _29590_/B
_tray_size4_976/QN2 -> _27100_/B
_tray_size4_976/QN2 -> _24673_/B
_tray_size4_976/QN2 -> _21592_/B
_tray_size4_976/QN2 -> _18459_/A
_tray_size2_965/QN0 -> _29591_/B
_tray_size2_965/QN0 -> _24716_/B
_tray_size2_965/QN0 -> _21707_/B
_tray_size2_965/QN0 -> _18545_/A
_tray_size2_963/QN0 -> _29593_/B
_tray_size2_963/QN0 -> _27660_/B
_tray_size2_963/QN0 -> _22294_/A
_tray_size2_963/QN0 -> _19169_/A
_tray_size2_963/QN0 -> _19166_/B
_tray_size2_962/QN0 -> _19139_/A
_tray_size2_962/QN0 -> _19147_/C
_tray_size2_962/QN0 -> _19156_/B
_tray_size2_962/QN0 -> _22300_/B
_tray_size2_962/QN0 -> _22302_/C
_tray_size2_962/QN0 -> _22328_/A
_tray_size2_962/QN0 -> _29594_/B
_tray_size4_1027/QN1 -> _19189_/A
_tray_size4_1027/QN1 -> _19193_/B
_tray_size4_1027/QN1 -> _19202_/B
_tray_size4_1027/QN1 -> _22368_/A
_tray_size4_1027/QN1 -> _27671_/B
_tray_size4_1027/QN1 -> _29595_/B
_tray_size2_962/QN1 -> _19237_/A
_tray_size2_962/QN1 -> _22387_/C
_tray_size2_962/QN1 -> _22388_/B
_tray_size2_962/QN1 -> _22433_/A
_tray_size2_962/QN1 -> _27686_/B
_tray_size2_962/QN1 -> _29596_/B
_tray_size2_964/QN0 -> _19311_/A
_tray_size2_964/QN0 -> _19318_/B
_tray_size2_964/QN0 -> _22471_/C
_tray_size2_964/QN0 -> _25261_/B
_tray_size2_964/QN0 -> _29597_/B
_tray_size2_963/QN1 -> _29598_/B
_tray_size2_963/QN1 -> _27722_/B
_tray_size2_963/QN1 -> _25288_/B
_tray_size2_963/QN1 -> _22357_/B
_tray_size2_963/QN1 -> _19269_/A
_tray_size4_1027/QN0 -> _29599_/B
_tray_size4_1027/QN0 -> _25330_/B
_tray_size4_1027/QN0 -> _22482_/B
_tray_size4_1027/QN0 -> _19350_/A
_tray_size4_970/QN1 -> _19398_/A
_tray_size4_970/QN1 -> _22294_/B
_tray_size4_970/QN1 -> _22368_/B
_tray_size4_970/QN1 -> _22433_/B
_tray_size4_970/QN1 -> _22525_/B
_tray_size4_970/QN1 -> _29600_/B
_tray_size4_961/QN1 -> _29625_/B
_tray_size4_961/QN1 -> _25191_/A
_tray_size4_961/QN1 -> _22322_/A
_tray_size4_961/QN1 -> _19172_/C
_tray_size4_961/QN1 -> _19171_/B
_tray_size4_1044/QN3 -> _19149_/B
_tray_size4_1044/QN3 -> _19151_/B
_tray_size4_1044/QN3 -> _19155_/A
_tray_size4_1044/QN3 -> _22303_/B
_tray_size4_1044/QN3 -> _22305_/C
_tray_size4_1044/QN3 -> _25193_/B
_tray_size4_1044/QN3 -> _27672_/B
_tray_size4_1044/QN3 -> _29626_/B
_tray_size4_961/QN3 -> _19195_/A
_tray_size4_961/QN3 -> _19206_/B
_tray_size4_961/QN3 -> _19207_/C
_tray_size4_961/QN3 -> _22340_/A
_tray_size4_961/QN3 -> _25209_/B
_tray_size4_961/QN3 -> _25219_/A
_tray_size4_961/QN3 -> _29627_/B
_tray_size4_961/QN0 -> _19242_/B
_tray_size4_961/QN0 -> _19244_/C
_tray_size4_961/QN0 -> _22376_/B
_tray_size4_961/QN0 -> _22377_/C
_tray_size4_961/QN0 -> _22389_/A
_tray_size4_961/QN0 -> _25236_/A
_tray_size4_961/QN0 -> _29628_/B
_tray_size4_1061/QN2 -> _19316_/B
_tray_size4_1061/QN2 -> _19319_/A
_tray_size4_1061/QN2 -> _22442_/B
_tray_size4_1061/QN2 -> _22444_/C
_tray_size4_1061/QN2 -> _29629_/B
_tray_size4_1061/QN0 -> _19272_/B
_tray_size4_1061/QN0 -> _22358_/B
_tray_size4_1061/QN0 -> _25263_/B
_tray_size4_1061/QN0 -> _25289_/B
_tray_size4_1061/QN0 -> _27751_/B
_tray_size4_1061/QN0 -> _29630_/B
_tray_size4_961/QN2 -> _19353_/B
_tray_size4_961/QN2 -> _22483_/B
_tray_size4_961/QN2 -> _25290_/A
_tray_size4_961/QN2 -> _25331_/B
_tray_size4_961/QN2 -> _27795_/B
_tray_size4_961/QN2 -> _29631_/B
_tray_size4_1061/QN1 -> _19401_/B
_tray_size4_1061/QN1 -> _22526_/B
_tray_size4_1061/QN1 -> _25191_/B
_tray_size4_1061/QN1 -> _25219_/B
_tray_size4_1061/QN1 -> _25236_/B
_tray_size4_1061/QN1 -> _25332_/A
_tray_size4_1061/QN1 -> _27661_/B
_tray_size4_1061/QN1 -> _29632_/B
_tray_size4_1008/QN0 -> _29633_/B
_tray_size4_1008/QN0 -> _25804_/A
_tray_size4_1008/QN0 -> _23082_/A
_tray_size4_1008/QN0 -> _19971_/C
_tray_size4_1008/QN0 -> _19970_/B
_tray_size4_996/QN0 -> _19947_/B
_tray_size4_996/QN0 -> _19949_/B
_tray_size4_996/QN0 -> _19954_/A
_tray_size4_996/QN0 -> _23063_/B
_tray_size4_996/QN0 -> _23065_/C
_tray_size4_996/QN0 -> _25806_/B
_tray_size4_996/QN0 -> _28295_/B
_tray_size4_996/QN0 -> _29634_/B
_tray_size4_1052/QN2 -> _19994_/A
_tray_size4_1052/QN2 -> _20005_/B
_tray_size4_1052/QN2 -> _20006_/C
_tray_size4_1052/QN2 -> _23100_/A
_tray_size4_1052/QN2 -> _25822_/B
_tray_size4_1052/QN2 -> _25832_/A
_tray_size4_1052/QN2 -> _29635_/B
_tray_size4_1007/QN1 -> _20040_/B
_tray_size4_1007/QN1 -> _20042_/C
_tray_size4_1007/QN1 -> _23136_/B
_tray_size4_1007/QN1 -> _23137_/C
_tray_size4_1007/QN1 -> _23149_/A
_tray_size4_1007/QN1 -> _25848_/A
_tray_size4_1007/QN1 -> _29636_/B
_tray_size4_1052/QN0 -> _20115_/B
_tray_size4_1052/QN0 -> _20118_/A
_tray_size4_1052/QN0 -> _23202_/B
_tray_size4_1052/QN0 -> _23204_/C
_tray_size4_1052/QN0 -> _29637_/B
_tray_size4_1049/QN2 -> _20071_/B
_tray_size4_1049/QN2 -> _23118_/B
_tray_size4_1049/QN2 -> _25875_/B
_tray_size4_1049/QN2 -> _25901_/B
_tray_size4_1049/QN2 -> _28374_/B
_tray_size4_1049/QN2 -> _29638_/B
_tray_size4_1049/QN1 -> _20153_/B
_tray_size4_1049/QN1 -> _23243_/B
_tray_size4_1049/QN1 -> _25902_/A
_tray_size4_1049/QN1 -> _25943_/B
_tray_size4_1049/QN1 -> _28418_/B
_tray_size4_1049/QN1 -> _29639_/B
_tray_size4_1052/QN3 -> _20202_/B
_tray_size4_1052/QN3 -> _23286_/B
_tray_size4_1052/QN3 -> _25804_/B
_tray_size4_1052/QN3 -> _25832_/B
_tray_size4_1052/QN3 -> _25848_/B
_tray_size4_1052/QN3 -> _25944_/A
_tray_size4_1052/QN3 -> _28284_/B
_tray_size4_1052/QN3 -> _29640_/B
_tray_size4_986/QN3 -> _29641_/B
_tray_size4_986/QN3 -> _26416_/A
_tray_size4_986/QN3 -> _23842_/A
_tray_size4_986/QN3 -> _20773_/C
_tray_size4_986/QN3 -> _20772_/B
_tray_size4_1050/QN0 -> _20749_/B
_tray_size4_1050/QN0 -> _20751_/B
_tray_size4_1050/QN0 -> _20756_/A
_tray_size4_1050/QN0 -> _23823_/B
_tray_size4_1050/QN0 -> _23825_/C
_tray_size4_1050/QN0 -> _26418_/B
_tray_size4_1050/QN0 -> _28918_/B
_tray_size4_1050/QN0 -> _29642_/B
_tray_size4_1048/QN3 -> _20796_/A
_tray_size4_1048/QN3 -> _20807_/B
_tray_size4_1048/QN3 -> _20808_/C
_tray_size4_1048/QN3 -> _23860_/A
_tray_size4_1048/QN3 -> _26434_/B
_tray_size4_1048/QN3 -> _26444_/A
_tray_size4_1048/QN3 -> _29643_/B
_tray_size4_995/QN1 -> _20843_/B
_tray_size4_995/QN1 -> _20845_/C
_tray_size4_995/QN1 -> _23896_/B
_tray_size4_995/QN1 -> _23897_/C
_tray_size4_995/QN1 -> _23909_/A
_tray_size4_995/QN1 -> _26460_/A
_tray_size4_995/QN1 -> _29644_/B
_tray_size4_1051/QN2 -> _20918_/B
_tray_size4_1051/QN2 -> _20921_/A
_tray_size4_1051/QN2 -> _23962_/B
_tray_size4_1051/QN2 -> _23964_/C
_tray_size4_1051/QN2 -> _29645_/B
_tray_size4_995/QN2 -> _20874_/B
_tray_size4_995/QN2 -> _23878_/B
_tray_size4_995/QN2 -> _26487_/B
_tray_size4_995/QN2 -> _26513_/B
_tray_size4_995/QN2 -> _28997_/B
_tray_size4_995/QN2 -> _29646_/B
_tray_size4_1048/QN2 -> _20956_/B
_tray_size4_1048/QN2 -> _24003_/B
_tray_size4_1048/QN2 -> _26514_/A
_tray_size4_1048/QN2 -> _26555_/B
_tray_size4_1048/QN2 -> _29041_/B
_tray_size4_1048/QN2 -> _29647_/B
_tray_size4_1051/QN0 -> _21004_/B
_tray_size4_1051/QN0 -> _24046_/B
_tray_size4_1051/QN0 -> _26416_/B
_tray_size4_1051/QN0 -> _26444_/B
_tray_size4_1051/QN0 -> _26460_/B
_tray_size4_1051/QN0 -> _26556_/A
_tray_size4_1051/QN0 -> _28907_/B
_tray_size4_1051/QN0 -> _29648_/B
_tray_size4_996/QN3 -> _29617_/B
_tray_size4_996/QN3 -> _24570_/B
_tray_size4_996/QN3 -> _21555_/A
_tray_size4_996/QN3 -> _18355_/C
_tray_size4_996/QN3 -> _18354_/B
_tray_size4_1008/QN3 -> _18326_/B
_tray_size4_1008/QN3 -> _18328_/B
_tray_size4_1008/QN3 -> _18337_/A
_tray_size4_1008/QN3 -> _21536_/B
_tray_size4_1008/QN3 -> _21538_/C
_tray_size4_1008/QN3 -> _24572_/B
_tray_size4_1008/QN3 -> _27050_/B
_tray_size4_1008/QN3 -> _29618_/B
_tray_size4_1031/QN1 -> _18380_/A
_tray_size4_1031/QN1 -> _18392_/B
_tray_size4_1031/QN1 -> _18393_/C
_tray_size4_1031/QN1 -> _21576_/A
_tray_size4_1031/QN1 -> _24588_/B
_tray_size4_1031/QN1 -> _24599_/B
_tray_size4_1031/QN1 -> _29619_/B
_tray_size4_1008/QN2 -> _18430_/B
_tray_size4_1008/QN2 -> _18432_/C
_tray_size4_1008/QN2 -> _21611_/B
_tray_size4_1008/QN2 -> _21612_/C
_tray_size4_1008/QN2 -> _21624_/A
_tray_size4_1008/QN2 -> _24601_/B
_tray_size4_1008/QN2 -> _24618_/B
_tray_size4_1008/QN2 -> _29620_/B
_tray_size4_996/QN2 -> _18508_/B
_tray_size4_996/QN2 -> _18511_/A
_tray_size4_996/QN2 -> _21674_/B
_tray_size4_996/QN2 -> _21676_/C
_tray_size4_996/QN2 -> _29621_/B
_tray_size4_1042/QN2 -> _18462_/B
_tray_size4_1042/QN2 -> _21593_/B
_tray_size4_1042/QN2 -> _24646_/B
_tray_size4_1042/QN2 -> _24674_/B
_tray_size4_1042/QN2 -> _27129_/B
_tray_size4_1042/QN2 -> _29622_/B
_tray_size4_1041/QN3 -> _18548_/B
_tray_size4_1041/QN3 -> _21708_/B
_tray_size4_1041/QN3 -> _24675_/A
_tray_size4_1041/QN3 -> _24717_/B
_tray_size4_1041/QN3 -> _27174_/B
_tray_size4_1041/QN3 -> _29623_/B
_tray_size4_1010/QN1 -> _30106_/B
_tray_size4_1010/QN1 -> _30104_/B
_tray_size4_1010/QN1 -> _29650_/A
_tray_size4_1076/QN3 -> _30381_/A
_tray_size4_1076/QN3 -> _29518_/A
_tray_size4_1010/QN0 -> _30105_/A
_tray_size4_1010/QN0 -> _30104_/A
_tray_size4_1010/QN0 -> _29651_/A
_tray_size2_1001/CLK -> _tray_size2_1001/QN0
_tray_size2_1001/CLK -> _tray_size2_1001/QN1
_tray_size2_1003/CLK -> _tray_size2_1003/QN1
_tray_size2_1003/CLK -> _tray_size2_1003/QN0
_tray_size2_1005/CLK -> _tray_size2_1005/QN0
_tray_size2_1005/CLK -> _tray_size2_1005/QN1
_tray_size2_1014/CLK -> _tray_size2_1014/QN0
_tray_size2_1014/CLK -> _tray_size2_1014/QN1
_tray_size2_1020/CLK -> _tray_size2_1020/QN0
_tray_size2_1020/CLK -> _tray_size2_1020/QN1
_tray_size2_1021/CLK -> _tray_size2_1021/QN1
_tray_size2_1021/CLK -> _tray_size2_1021/QN0
_tray_size2_1023/CLK -> _tray_size2_1023/QN1
_tray_size2_1023/CLK -> _tray_size2_1023/QN0
_tray_size2_1024/CLK -> _tray_size2_1024/QN1
_tray_size2_1024/CLK -> _tray_size2_1024/QN0
_tray_size2_1030/CLK -> _tray_size2_1030/QN0
_tray_size2_1030/CLK -> _tray_size2_1030/QN1
_tray_size2_1038/CLK -> _tray_size2_1038/QN0
_tray_size2_1038/CLK -> _tray_size2_1038/QN1
_tray_size2_1068/CLK -> _tray_size2_1068/QN1
_tray_size2_1068/CLK -> _tray_size2_1068/QN0
_tray_size2_1070/CLK -> _tray_size2_1070/QN0
_tray_size2_1070/CLK -> _tray_size2_1070/QN1
_tray_size2_1086/CLK -> _tray_size2_1086/QN0
_tray_size2_1086/CLK -> _tray_size2_1086/QN1
_tray_size2_1088/CLK -> _tray_size2_1088/QN0
_tray_size2_1088/CLK -> _tray_size2_1088/QN1
_tray_size2_1102/CLK -> _tray_size2_1102/QN0
_tray_size2_1102/CLK -> _tray_size2_1102/QN1
_tray_size2_1103/CLK -> _tray_size2_1103/QN0
_tray_size2_1104/CLK -> _tray_size2_1104/QN1
_tray_size2_1104/CLK -> _tray_size2_1104/QN0
_tray_size2_1110/CLK -> _tray_size2_1110/QN1
_tray_size2_1110/CLK -> _tray_size2_1110/QN0
_tray_size2_1111/CLK -> _tray_size2_1111/QN0
_tray_size2_1115/CLK -> _tray_size2_1115/QN0
_tray_size2_1115/CLK -> _tray_size2_1115/QN1
_tray_size2_1116/CLK -> _tray_size2_1116/QN0
_tray_size2_1116/CLK -> _tray_size2_1116/QN1
_tray_size2_1117/CLK -> _tray_size2_1117/QN0
_tray_size2_1117/CLK -> _tray_size2_1117/QN1
_tray_size2_1120/CLK -> _tray_size2_1120/QN1
_tray_size2_1120/CLK -> _tray_size2_1120/QN0
_tray_size2_1122/CLK -> _tray_size2_1122/QN0
_tray_size2_1122/CLK -> _tray_size2_1122/QN1
_tray_size2_1123/CLK -> _tray_size2_1123/QN0
_tray_size2_1123/CLK -> _tray_size2_1123/QN1
_tray_size2_962/CLK -> _tray_size2_962/QN0
_tray_size2_962/CLK -> _tray_size2_962/QN1
_tray_size2_963/CLK -> _tray_size2_963/QN0
_tray_size2_963/CLK -> _tray_size2_963/QN1
_tray_size2_964/CLK -> _tray_size2_964/QN1
_tray_size2_964/CLK -> _tray_size2_964/QN0
_tray_size2_965/CLK -> _tray_size2_965/QN1
_tray_size2_965/CLK -> _tray_size2_965/QN0
_tray_size2_966/CLK -> _tray_size2_966/QN1
_tray_size2_966/CLK -> _tray_size2_966/QN0
_tray_size2_969/CLK -> _tray_size2_969/QN0
_tray_size2_969/CLK -> _tray_size2_969/QN1
_tray_size2_972/CLK -> _tray_size2_972/QN1
_tray_size2_972/CLK -> _tray_size2_972/QN0
_tray_size2_973/CLK -> _tray_size2_973/QN1
_tray_size2_973/CLK -> _tray_size2_973/QN0
_tray_size2_974/CLK -> _tray_size2_974/QN0
_tray_size2_974/CLK -> _tray_size2_974/QN1
_tray_size2_979/CLK -> _tray_size2_979/QN1
_tray_size2_979/CLK -> _tray_size2_979/QN0
_tray_size2_980/CLK -> _tray_size2_980/QN1
_tray_size2_980/CLK -> _tray_size2_980/QN0
_tray_size2_981/CLK -> _tray_size2_981/QN0
_tray_size2_981/CLK -> _tray_size2_981/QN1
_tray_size2_983/CLK -> _tray_size2_983/QN1
_tray_size2_983/CLK -> _tray_size2_983/QN0
_tray_size2_984/CLK -> _tray_size2_984/QN0
_tray_size2_984/CLK -> _tray_size2_984/QN1
_tray_size2_989/CLK -> _tray_size2_989/QN1
_tray_size2_989/CLK -> _tray_size2_989/QN0
_tray_size2_991/CLK -> _tray_size2_991/QN0
_tray_size2_991/CLK -> _tray_size2_991/QN1
_tray_size2_992/CLK -> _tray_size2_992/QN1
_tray_size2_992/CLK -> _tray_size2_992/QN0
_tray_size2_993/CLK -> _tray_size2_993/QN1
_tray_size2_993/CLK -> _tray_size2_993/QN0
_tray_size2_994/CLK -> _tray_size2_994/QN1
_tray_size2_994/CLK -> _tray_size2_994/QN0
_tray_size4_1000/CLK -> _tray_size4_1000/QN2
_tray_size4_1000/CLK -> _tray_size4_1000/QN0
_tray_size4_1000/CLK -> _tray_size4_1000/QN1
_tray_size4_1000/CLK -> _tray_size4_1000/QN3
_tray_size4_1002/CLK -> _tray_size4_1002/QN1
_tray_size4_1002/CLK -> _tray_size4_1002/QN0
_tray_size4_1002/CLK -> _tray_size4_1002/QN2
_tray_size4_1002/CLK -> _tray_size4_1002/QN3
_tray_size4_1004/CLK -> _tray_size4_1004/QN3
_tray_size4_1004/CLK -> _tray_size4_1004/QN1
_tray_size4_1004/CLK -> _tray_size4_1004/QN0
_tray_size4_1004/CLK -> _tray_size4_1004/QN2
_tray_size4_1006/CLK -> _tray_size4_1006/QN1
_tray_size4_1006/CLK -> _tray_size4_1006/QN0
_tray_size4_1006/CLK -> _tray_size4_1006/QN3
_tray_size4_1006/CLK -> _tray_size4_1006/QN2
_tray_size4_1007/CLK -> _tray_size4_1007/QN2
_tray_size4_1007/CLK -> _tray_size4_1007/QN3
_tray_size4_1007/CLK -> _tray_size4_1007/QN0
_tray_size4_1007/CLK -> _tray_size4_1007/QN1
_tray_size4_1008/CLK -> _tray_size4_1008/QN1
_tray_size4_1008/CLK -> _tray_size4_1008/QN0
_tray_size4_1008/CLK -> _tray_size4_1008/QN3
_tray_size4_1008/CLK -> _tray_size4_1008/QN2
_tray_size4_1009/CLK -> _tray_size4_1009/QN1
_tray_size4_1009/CLK -> _tray_size4_1009/QN0
_tray_size4_1009/CLK -> _tray_size4_1009/QN2
_tray_size4_1009/CLK -> _tray_size4_1009/QN3
_tray_size4_1010/CLK -> _tray_size4_1010/QN3
_tray_size4_1010/CLK -> _tray_size4_1010/QN2
_tray_size4_1010/CLK -> _tray_size4_1010/QN1
_tray_size4_1010/CLK -> _tray_size4_1010/QN0
_tray_size4_1011/CLK -> _tray_size4_1011/QN3
_tray_size4_1011/CLK -> _tray_size4_1011/QN1
_tray_size4_1011/CLK -> _tray_size4_1011/QN2
_tray_size4_1011/CLK -> _tray_size4_1011/QN0
_tray_size4_1012/CLK -> _tray_size4_1012/QN2
_tray_size4_1012/CLK -> _tray_size4_1012/QN1
_tray_size4_1012/CLK -> _tray_size4_1012/QN0
_tray_size4_1012/CLK -> _tray_size4_1012/QN3
_tray_size4_1013/CLK -> _tray_size4_1013/QN3
_tray_size4_1013/CLK -> _tray_size4_1013/QN1
_tray_size4_1013/CLK -> _tray_size4_1013/QN0
_tray_size4_1013/CLK -> _tray_size4_1013/QN2
_tray_size4_1015/CLK -> _tray_size4_1015/QN0
_tray_size4_1015/CLK -> _tray_size4_1015/QN1
_tray_size4_1015/CLK -> _tray_size4_1015/QN3
_tray_size4_1015/CLK -> _tray_size4_1015/QN2
_tray_size4_1016/CLK -> _tray_size4_1016/QN1
_tray_size4_1016/CLK -> _tray_size4_1016/QN0
_tray_size4_1016/CLK -> _tray_size4_1016/QN2
_tray_size4_1016/CLK -> _tray_size4_1016/QN3
_tray_size4_1017/CLK -> _tray_size4_1017/QN3
_tray_size4_1017/CLK -> _tray_size4_1017/QN2
_tray_size4_1017/CLK -> _tray_size4_1017/QN0
_tray_size4_1017/CLK -> _tray_size4_1017/QN1
_tray_size4_1018/CLK -> _tray_size4_1018/QN1
_tray_size4_1018/CLK -> _tray_size4_1018/QN0
_tray_size4_1018/CLK -> _tray_size4_1018/QN2
_tray_size4_1018/CLK -> _tray_size4_1018/QN3
_tray_size4_1019/CLK -> _tray_size4_1019/QN2
_tray_size4_1019/CLK -> _tray_size4_1019/QN0
_tray_size4_1019/CLK -> _tray_size4_1019/QN1
_tray_size4_1019/CLK -> _tray_size4_1019/QN3
_tray_size4_1022/CLK -> _tray_size4_1022/QN0
_tray_size4_1022/CLK -> _tray_size4_1022/QN2
_tray_size4_1022/CLK -> _tray_size4_1022/QN3
_tray_size4_1022/CLK -> _tray_size4_1022/QN1
_tray_size4_1025/CLK -> _tray_size4_1025/QN1
_tray_size4_1025/CLK -> _tray_size4_1025/QN2
_tray_size4_1025/CLK -> _tray_size4_1025/QN3
_tray_size4_1025/CLK -> _tray_size4_1025/QN0
_tray_size4_1026/CLK -> _tray_size4_1026/QN1
_tray_size4_1026/CLK -> _tray_size4_1026/QN0
_tray_size4_1026/CLK -> _tray_size4_1026/QN3
_tray_size4_1026/CLK -> _tray_size4_1026/QN2
_tray_size4_1027/CLK -> _tray_size4_1027/QN3
_tray_size4_1027/CLK -> _tray_size4_1027/QN2
_tray_size4_1027/CLK -> _tray_size4_1027/QN1
_tray_size4_1027/CLK -> _tray_size4_1027/QN0
_tray_size4_1028/CLK -> _tray_size4_1028/QN0
_tray_size4_1028/CLK -> _tray_size4_1028/QN2
_tray_size4_1028/CLK -> _tray_size4_1028/QN1
_tray_size4_1028/CLK -> _tray_size4_1028/QN3
_tray_size4_1029/CLK -> _tray_size4_1029/QN0
_tray_size4_1029/CLK -> _tray_size4_1029/QN2
_tray_size4_1029/CLK -> _tray_size4_1029/QN3
_tray_size4_1029/CLK -> _tray_size4_1029/QN1
_tray_size4_1031/CLK -> _tray_size4_1031/QN0
_tray_size4_1031/CLK -> _tray_size4_1031/QN2
_tray_size4_1031/CLK -> _tray_size4_1031/QN3
_tray_size4_1031/CLK -> _tray_size4_1031/QN1
_tray_size4_1032/CLK -> _tray_size4_1032/QN0
_tray_size4_1032/CLK -> _tray_size4_1032/QN3
_tray_size4_1032/CLK -> _tray_size4_1032/QN2
_tray_size4_1032/CLK -> _tray_size4_1032/QN1
_tray_size4_1033/CLK -> _tray_size4_1033/QN0
_tray_size4_1033/CLK -> _tray_size4_1033/QN1
_tray_size4_1033/CLK -> _tray_size4_1033/QN3
_tray_size4_1033/CLK -> _tray_size4_1033/QN2
_tray_size4_1034/CLK -> _tray_size4_1034/QN0
_tray_size4_1034/CLK -> _tray_size4_1034/QN2
_tray_size4_1034/CLK -> _tray_size4_1034/QN1
_tray_size4_1034/CLK -> _tray_size4_1034/QN3
_tray_size4_1035/CLK -> _tray_size4_1035/QN3
_tray_size4_1035/CLK -> _tray_size4_1035/QN0
_tray_size4_1035/CLK -> _tray_size4_1035/QN2
_tray_size4_1035/CLK -> _tray_size4_1035/QN1
_tray_size4_1036/CLK -> _tray_size4_1036/QN2
_tray_size4_1036/CLK -> _tray_size4_1036/QN1
_tray_size4_1036/CLK -> _tray_size4_1036/QN0
_tray_size4_1036/CLK -> _tray_size4_1036/QN3
_tray_size4_1037/CLK -> _tray_size4_1037/QN3
_tray_size4_1037/CLK -> _tray_size4_1037/QN1
_tray_size4_1037/CLK -> _tray_size4_1037/QN0
_tray_size4_1039/CLK -> _tray_size4_1039/QN1
_tray_size4_1039/CLK -> _tray_size4_1039/QN2
_tray_size4_1039/CLK -> _tray_size4_1039/QN0
_tray_size4_1039/CLK -> _tray_size4_1039/QN3
_tray_size4_1040/CLK -> _tray_size4_1040/QN1
_tray_size4_1040/CLK -> _tray_size4_1040/QN0
_tray_size4_1040/CLK -> _tray_size4_1040/QN2
_tray_size4_1040/CLK -> _tray_size4_1040/QN3
_tray_size4_1041/CLK -> _tray_size4_1041/QN1
_tray_size4_1041/CLK -> _tray_size4_1041/QN2
_tray_size4_1041/CLK -> _tray_size4_1041/QN0
_tray_size4_1041/CLK -> _tray_size4_1041/QN3
_tray_size4_1042/CLK -> _tray_size4_1042/QN0
_tray_size4_1042/CLK -> _tray_size4_1042/QN1
_tray_size4_1042/CLK -> _tray_size4_1042/QN3
_tray_size4_1042/CLK -> _tray_size4_1042/QN2
_tray_size4_1043/CLK -> _tray_size4_1043/QN1
_tray_size4_1043/CLK -> _tray_size4_1043/QN2
_tray_size4_1043/CLK -> _tray_size4_1043/QN3
_tray_size4_1043/CLK -> _tray_size4_1043/QN0
_tray_size4_1044/CLK -> _tray_size4_1044/QN0
_tray_size4_1044/CLK -> _tray_size4_1044/QN1
_tray_size4_1044/CLK -> _tray_size4_1044/QN2
_tray_size4_1044/CLK -> _tray_size4_1044/QN3
_tray_size4_1045/CLK -> _tray_size4_1045/QN3
_tray_size4_1045/CLK -> _tray_size4_1045/QN1
_tray_size4_1045/CLK -> _tray_size4_1045/QN0
_tray_size4_1045/CLK -> _tray_size4_1045/QN2
_tray_size4_1046/CLK -> _tray_size4_1046/QN3
_tray_size4_1046/CLK -> _tray_size4_1046/QN0
_tray_size4_1046/CLK -> _tray_size4_1046/QN1
_tray_size4_1046/CLK -> _tray_size4_1046/QN2
_tray_size4_1047/CLK -> _tray_size4_1047/QN1
_tray_size4_1047/CLK -> _tray_size4_1047/QN3
_tray_size4_1047/CLK -> _tray_size4_1047/QN0
_tray_size4_1047/CLK -> _tray_size4_1047/QN2
_tray_size4_1048/CLK -> _tray_size4_1048/QN0
_tray_size4_1048/CLK -> _tray_size4_1048/QN1
_tray_size4_1048/CLK -> _tray_size4_1048/QN3
_tray_size4_1048/CLK -> _tray_size4_1048/QN2
_tray_size4_1049/CLK -> _tray_size4_1049/QN3
_tray_size4_1049/CLK -> _tray_size4_1049/QN0
_tray_size4_1049/CLK -> _tray_size4_1049/QN2
_tray_size4_1049/CLK -> _tray_size4_1049/QN1
_tray_size4_1050/CLK -> _tray_size4_1050/QN2
_tray_size4_1050/CLK -> _tray_size4_1050/QN1
_tray_size4_1050/CLK -> _tray_size4_1050/QN3
_tray_size4_1050/CLK -> _tray_size4_1050/QN0
_tray_size4_1051/CLK -> _tray_size4_1051/QN3
_tray_size4_1051/CLK -> _tray_size4_1051/QN1
_tray_size4_1051/CLK -> _tray_size4_1051/QN2
_tray_size4_1051/CLK -> _tray_size4_1051/QN0
_tray_size4_1052/CLK -> _tray_size4_1052/QN1
_tray_size4_1052/CLK -> _tray_size4_1052/QN2
_tray_size4_1052/CLK -> _tray_size4_1052/QN0
_tray_size4_1052/CLK -> _tray_size4_1052/QN3
_tray_size4_1053/CLK -> _tray_size4_1053/QN0
_tray_size4_1053/CLK -> _tray_size4_1053/QN1
_tray_size4_1053/CLK -> _tray_size4_1053/QN3
_tray_size4_1053/CLK -> _tray_size4_1053/QN2
_tray_size4_1054/CLK -> _tray_size4_1054/QN1
_tray_size4_1054/CLK -> _tray_size4_1054/QN2
_tray_size4_1054/CLK -> _tray_size4_1054/QN0
_tray_size4_1054/CLK -> _tray_size4_1054/QN3
_tray_size4_1055/CLK -> _tray_size4_1055/QN0
_tray_size4_1055/CLK -> _tray_size4_1055/QN3
_tray_size4_1055/CLK -> _tray_size4_1055/QN1
_tray_size4_1055/CLK -> _tray_size4_1055/QN2
_tray_size4_1056/CLK -> _tray_size4_1056/QN2
_tray_size4_1056/CLK -> _tray_size4_1056/QN0
_tray_size4_1056/CLK -> _tray_size4_1056/QN3
_tray_size4_1056/CLK -> _tray_size4_1056/QN1
_tray_size4_1057/CLK -> _tray_size4_1057/QN2
_tray_size4_1057/CLK -> _tray_size4_1057/QN1
_tray_size4_1057/CLK -> _tray_size4_1057/QN0
_tray_size4_1057/CLK -> _tray_size4_1057/QN3
_tray_size4_1058/CLK -> _tray_size4_1058/QN3
_tray_size4_1058/CLK -> _tray_size4_1058/QN1
_tray_size4_1058/CLK -> _tray_size4_1058/QN0
_tray_size4_1058/CLK -> _tray_size4_1058/QN2
_tray_size4_1059/CLK -> _tray_size4_1059/QN2
_tray_size4_1059/CLK -> _tray_size4_1059/QN3
_tray_size4_1059/CLK -> _tray_size4_1059/QN1
_tray_size4_1059/CLK -> _tray_size4_1059/QN0
_tray_size4_1060/CLK -> _tray_size4_1060/QN1
_tray_size4_1060/CLK -> _tray_size4_1060/QN3
_tray_size4_1060/CLK -> _tray_size4_1060/QN2
_tray_size4_1060/CLK -> _tray_size4_1060/QN0
_tray_size4_1061/CLK -> _tray_size4_1061/QN3
_tray_size4_1061/CLK -> _tray_size4_1061/QN2
_tray_size4_1061/CLK -> _tray_size4_1061/QN0
_tray_size4_1061/CLK -> _tray_size4_1061/QN1
_tray_size4_1062/CLK -> _tray_size4_1062/QN0
_tray_size4_1062/CLK -> _tray_size4_1062/QN2
_tray_size4_1062/CLK -> _tray_size4_1062/QN3
_tray_size4_1062/CLK -> _tray_size4_1062/QN1
_tray_size4_1063/CLK -> _tray_size4_1063/QN2
_tray_size4_1063/CLK -> _tray_size4_1063/QN1
_tray_size4_1063/CLK -> _tray_size4_1063/QN3
_tray_size4_1063/CLK -> _tray_size4_1063/QN0
_tray_size4_1064/CLK -> _tray_size4_1064/QN0
_tray_size4_1064/CLK -> _tray_size4_1064/QN1
_tray_size4_1064/CLK -> _tray_size4_1064/QN3
_tray_size4_1064/CLK -> _tray_size4_1064/QN2
_tray_size4_1065/CLK -> _tray_size4_1065/QN1
_tray_size4_1065/CLK -> _tray_size4_1065/QN0
_tray_size4_1065/CLK -> _tray_size4_1065/QN3
_tray_size4_1065/CLK -> _tray_size4_1065/QN2
_tray_size4_1066/CLK -> _tray_size4_1066/QN0
_tray_size4_1066/CLK -> _tray_size4_1066/QN1
_tray_size4_1066/CLK -> _tray_size4_1066/QN2
_tray_size4_1066/CLK -> _tray_size4_1066/QN3
_tray_size4_1067/CLK -> _tray_size4_1067/QN0
_tray_size4_1067/CLK -> _tray_size4_1067/QN1
_tray_size4_1067/CLK -> _tray_size4_1067/QN3
_tray_size4_1067/CLK -> _tray_size4_1067/QN2
_tray_size4_1069/CLK -> _tray_size4_1069/QN2
_tray_size4_1069/CLK -> _tray_size4_1069/QN0
_tray_size4_1069/CLK -> _tray_size4_1069/QN1
_tray_size4_1069/CLK -> _tray_size4_1069/QN3
_tray_size4_1071/CLK -> _tray_size4_1071/QN0
_tray_size4_1071/CLK -> _tray_size4_1071/QN2
_tray_size4_1071/CLK -> _tray_size4_1071/QN1
_tray_size4_1071/CLK -> _tray_size4_1071/QN3
_tray_size4_1072/CLK -> _tray_size4_1072/QN0
_tray_size4_1072/CLK -> _tray_size4_1072/QN1
_tray_size4_1072/CLK -> _tray_size4_1072/QN3
_tray_size4_1072/CLK -> _tray_size4_1072/QN2
_tray_size4_1073/CLK -> _tray_size4_1073/QN2
_tray_size4_1073/CLK -> _tray_size4_1073/QN3
_tray_size4_1073/CLK -> _tray_size4_1073/QN1
_tray_size4_1073/CLK -> _tray_size4_1073/QN0
_tray_size4_1074/CLK -> _tray_size4_1074/QN0
_tray_size4_1074/CLK -> _tray_size4_1074/QN2
_tray_size4_1074/CLK -> _tray_size4_1074/QN3
_tray_size4_1074/CLK -> _tray_size4_1074/QN1
_tray_size4_1075/CLK -> _tray_size4_1075/QN0
_tray_size4_1075/CLK -> _tray_size4_1075/QN1
_tray_size4_1075/CLK -> _tray_size4_1075/QN2
_tray_size4_1075/CLK -> _tray_size4_1075/QN3
_tray_size4_1076/CLK -> _tray_size4_1076/QN0
_tray_size4_1076/CLK -> _tray_size4_1076/QN2
_tray_size4_1076/CLK -> _tray_size4_1076/QN1
_tray_size4_1076/CLK -> _tray_size4_1076/QN3
_tray_size4_1077/CLK -> _tray_size4_1077/QN2
_tray_size4_1077/CLK -> _tray_size4_1077/QN0
_tray_size4_1077/CLK -> _tray_size4_1077/QN1
_tray_size4_1077/CLK -> _tray_size4_1077/QN3
_tray_size4_1078/CLK -> _tray_size4_1078/QN1
_tray_size4_1078/CLK -> _tray_size4_1078/QN0
_tray_size4_1078/CLK -> _tray_size4_1078/QN2
_tray_size4_1078/CLK -> _tray_size4_1078/QN3
_tray_size4_1079/CLK -> _tray_size4_1079/QN2
_tray_size4_1079/CLK -> _tray_size4_1079/QN0
_tray_size4_1079/CLK -> _tray_size4_1079/QN1
_tray_size4_1079/CLK -> _tray_size4_1079/QN3
_tray_size4_1080/CLK -> _tray_size4_1080/QN0
_tray_size4_1080/CLK -> _tray_size4_1080/QN3
_tray_size4_1080/CLK -> _tray_size4_1080/QN1
_tray_size4_1080/CLK -> _tray_size4_1080/QN2
_tray_size4_1081/CLK -> _tray_size4_1081/QN2
_tray_size4_1081/CLK -> _tray_size4_1081/QN0
_tray_size4_1081/CLK -> _tray_size4_1081/QN1
_tray_size4_1081/CLK -> _tray_size4_1081/QN3
_tray_size4_1082/CLK -> _tray_size4_1082/QN1
_tray_size4_1082/CLK -> _tray_size4_1082/QN0
_tray_size4_1082/CLK -> _tray_size4_1082/QN2
_tray_size4_1082/CLK -> _tray_size4_1082/QN3
_tray_size4_1083/CLK -> _tray_size4_1083/QN1
_tray_size4_1083/CLK -> _tray_size4_1083/QN3
_tray_size4_1083/CLK -> _tray_size4_1083/QN2
_tray_size4_1083/CLK -> _tray_size4_1083/QN0
_tray_size4_1084/CLK -> _tray_size4_1084/QN2
_tray_size4_1084/CLK -> _tray_size4_1084/QN1
_tray_size4_1084/CLK -> _tray_size4_1084/QN3
_tray_size4_1084/CLK -> _tray_size4_1084/QN0
_tray_size4_1085/CLK -> _tray_size4_1085/QN3
_tray_size4_1085/CLK -> _tray_size4_1085/QN1
_tray_size4_1085/CLK -> _tray_size4_1085/QN2
_tray_size4_1085/CLK -> _tray_size4_1085/QN0
_tray_size4_1087/CLK -> _tray_size4_1087/QN0
_tray_size4_1087/CLK -> _tray_size4_1087/QN3
_tray_size4_1087/CLK -> _tray_size4_1087/QN2
_tray_size4_1087/CLK -> _tray_size4_1087/QN1
_tray_size4_1089/CLK -> _tray_size4_1089/QN3
_tray_size4_1089/CLK -> _tray_size4_1089/QN0
_tray_size4_1089/CLK -> _tray_size4_1089/QN1
_tray_size4_1089/CLK -> _tray_size4_1089/QN2
_tray_size4_1090/CLK -> _tray_size4_1090/QN2
_tray_size4_1090/CLK -> _tray_size4_1090/QN0
_tray_size4_1090/CLK -> _tray_size4_1090/QN1
_tray_size4_1090/CLK -> _tray_size4_1090/QN3
_tray_size4_1091/CLK -> _tray_size4_1091/QN0
_tray_size4_1091/CLK -> _tray_size4_1091/QN2
_tray_size4_1091/CLK -> _tray_size4_1091/QN1
_tray_size4_1091/CLK -> _tray_size4_1091/QN3
_tray_size4_1092/CLK -> _tray_size4_1092/QN1
_tray_size4_1092/CLK -> _tray_size4_1092/QN2
_tray_size4_1092/CLK -> _tray_size4_1092/QN3
_tray_size4_1092/CLK -> _tray_size4_1092/QN0
_tray_size4_1093/CLK -> _tray_size4_1093/QN2
_tray_size4_1093/CLK -> _tray_size4_1093/QN3
_tray_size4_1093/CLK -> _tray_size4_1093/QN1
_tray_size4_1093/CLK -> _tray_size4_1093/QN0
_tray_size4_1094/CLK -> _tray_size4_1094/QN0
_tray_size4_1094/CLK -> _tray_size4_1094/QN1
_tray_size4_1094/CLK -> _tray_size4_1094/QN3
_tray_size4_1094/CLK -> _tray_size4_1094/QN2
_tray_size4_1095/CLK -> _tray_size4_1095/QN0
_tray_size4_1095/CLK -> _tray_size4_1095/QN3
_tray_size4_1095/CLK -> _tray_size4_1095/QN1
_tray_size4_1095/CLK -> _tray_size4_1095/QN2
_tray_size4_1096/CLK -> _tray_size4_1096/QN1
_tray_size4_1096/CLK -> _tray_size4_1096/QN0
_tray_size4_1096/CLK -> _tray_size4_1096/QN3
_tray_size4_1096/CLK -> _tray_size4_1096/QN2
_tray_size4_1097/CLK -> _tray_size4_1097/QN3
_tray_size4_1097/CLK -> _tray_size4_1097/QN0
_tray_size4_1097/CLK -> _tray_size4_1097/QN1
_tray_size4_1097/CLK -> _tray_size4_1097/QN2
_tray_size4_1098/CLK -> _tray_size4_1098/QN1
_tray_size4_1098/CLK -> _tray_size4_1098/QN2
_tray_size4_1098/CLK -> _tray_size4_1098/QN0
_tray_size4_1098/CLK -> _tray_size4_1098/QN3
_tray_size4_1099/CLK -> _tray_size4_1099/QN3
_tray_size4_1099/CLK -> _tray_size4_1099/QN2
_tray_size4_1099/CLK -> _tray_size4_1099/QN1
_tray_size4_1099/CLK -> _tray_size4_1099/QN0
_tray_size4_1100/CLK -> _tray_size4_1100/QN3
_tray_size4_1100/CLK -> _tray_size4_1100/QN2
_tray_size4_1100/CLK -> _tray_size4_1100/QN1
_tray_size4_1100/CLK -> _tray_size4_1100/QN0
_tray_size4_1101/CLK -> _tray_size4_1101/QN3
_tray_size4_1101/CLK -> _tray_size4_1101/QN0
_tray_size4_1101/CLK -> _tray_size4_1101/QN1
_tray_size4_1101/CLK -> _tray_size4_1101/QN2
_tray_size4_1105/CLK -> _tray_size4_1105/QN3
_tray_size4_1105/CLK -> _tray_size4_1105/QN2
_tray_size4_1105/CLK -> _tray_size4_1105/QN0
_tray_size4_1105/CLK -> _tray_size4_1105/QN1
_tray_size4_1106/CLK -> _tray_size4_1106/QN2
_tray_size4_1106/CLK -> _tray_size4_1106/QN0
_tray_size4_1106/CLK -> _tray_size4_1106/QN3
_tray_size4_1106/CLK -> _tray_size4_1106/QN1
_tray_size4_1107/CLK -> _tray_size4_1107/QN1
_tray_size4_1107/CLK -> _tray_size4_1107/QN0
_tray_size4_1107/CLK -> _tray_size4_1107/QN3
_tray_size4_1107/CLK -> _tray_size4_1107/QN2
_tray_size4_1108/CLK -> _tray_size4_1108/QN0
_tray_size4_1108/CLK -> _tray_size4_1108/QN1
_tray_size4_1108/CLK -> _tray_size4_1108/QN2
_tray_size4_1108/CLK -> _tray_size4_1108/QN3
_tray_size4_1109/CLK -> _tray_size4_1109/QN3
_tray_size4_1109/CLK -> _tray_size4_1109/QN0
_tray_size4_1109/CLK -> _tray_size4_1109/QN2
_tray_size4_1109/CLK -> _tray_size4_1109/QN1
_tray_size4_1112/CLK -> _tray_size4_1112/QN0
_tray_size4_1112/CLK -> _tray_size4_1112/QN1
_tray_size4_1112/CLK -> _tray_size4_1112/QN2
_tray_size4_1112/CLK -> _tray_size4_1112/QN3
_tray_size4_1113/CLK -> _tray_size4_1113/QN0
_tray_size4_1113/CLK -> _tray_size4_1113/QN1
_tray_size4_1113/CLK -> _tray_size4_1113/QN2
_tray_size4_1113/CLK -> _tray_size4_1113/QN3
_tray_size4_1114/CLK -> _tray_size4_1114/QN1
_tray_size4_1114/CLK -> _tray_size4_1114/QN2
_tray_size4_1114/CLK -> _tray_size4_1114/QN0
_tray_size4_1114/CLK -> _tray_size4_1114/QN3
_tray_size4_1118/CLK -> _tray_size4_1118/QN0
_tray_size4_1118/CLK -> _tray_size4_1118/QN2
_tray_size4_1118/CLK -> _tray_size4_1118/QN3
_tray_size4_1118/CLK -> _tray_size4_1118/QN1
_tray_size4_1119/CLK -> _tray_size4_1119/QN1
_tray_size4_1119/CLK -> _tray_size4_1119/QN2
_tray_size4_1119/CLK -> _tray_size4_1119/QN3
_tray_size4_1119/CLK -> _tray_size4_1119/QN0
_tray_size4_1121/CLK -> _tray_size4_1121/QN1
_tray_size4_1121/CLK -> _tray_size4_1121/QN2
_tray_size4_1121/CLK -> _tray_size4_1121/QN0
_tray_size4_1121/CLK -> _tray_size4_1121/QN3
_tray_size4_961/CLK -> _tray_size4_961/QN1
_tray_size4_961/CLK -> _tray_size4_961/QN3
_tray_size4_961/CLK -> _tray_size4_961/QN0
_tray_size4_961/CLK -> _tray_size4_961/QN2
_tray_size4_967/CLK -> _tray_size4_967/QN2
_tray_size4_967/CLK -> _tray_size4_967/QN0
_tray_size4_967/CLK -> _tray_size4_967/QN1
_tray_size4_967/CLK -> _tray_size4_967/QN3
_tray_size4_968/CLK -> _tray_size4_968/QN2
_tray_size4_968/CLK -> _tray_size4_968/QN0
_tray_size4_968/CLK -> _tray_size4_968/QN3
_tray_size4_968/CLK -> _tray_size4_968/QN1
_tray_size4_970/CLK -> _tray_size4_970/QN2
_tray_size4_970/CLK -> _tray_size4_970/QN0
_tray_size4_970/CLK -> _tray_size4_970/QN3
_tray_size4_970/CLK -> _tray_size4_970/QN1
_tray_size4_971/CLK -> _tray_size4_971/QN1
_tray_size4_971/CLK -> _tray_size4_971/QN0
_tray_size4_971/CLK -> _tray_size4_971/QN2
_tray_size4_971/CLK -> _tray_size4_971/QN3
_tray_size4_975/CLK -> _tray_size4_975/QN0
_tray_size4_975/CLK -> _tray_size4_975/QN2
_tray_size4_975/CLK -> _tray_size4_975/QN1
_tray_size4_975/CLK -> _tray_size4_975/QN3
_tray_size4_976/CLK -> _tray_size4_976/QN0
_tray_size4_976/CLK -> _tray_size4_976/QN1
_tray_size4_976/CLK -> _tray_size4_976/QN3
_tray_size4_976/CLK -> _tray_size4_976/QN2
_tray_size4_977/CLK -> _tray_size4_977/QN3
_tray_size4_977/CLK -> _tray_size4_977/QN2
_tray_size4_977/CLK -> _tray_size4_977/QN0
_tray_size4_977/CLK -> _tray_size4_977/QN1
_tray_size4_978/CLK -> _tray_size4_978/QN1
_tray_size4_978/CLK -> _tray_size4_978/QN3
_tray_size4_978/CLK -> _tray_size4_978/QN2
_tray_size4_978/CLK -> _tray_size4_978/QN0
_tray_size4_982/CLK -> _tray_size4_982/QN1
_tray_size4_982/CLK -> _tray_size4_982/QN2
_tray_size4_982/CLK -> _tray_size4_982/QN3
_tray_size4_982/CLK -> _tray_size4_982/QN0
_tray_size4_985/CLK -> _tray_size4_985/QN3
_tray_size4_985/CLK -> _tray_size4_985/QN2
_tray_size4_985/CLK -> _tray_size4_985/QN0
_tray_size4_985/CLK -> _tray_size4_985/QN1
_tray_size4_986/CLK -> _tray_size4_986/QN1
_tray_size4_986/CLK -> _tray_size4_986/QN0
_tray_size4_986/CLK -> _tray_size4_986/QN2
_tray_size4_986/CLK -> _tray_size4_986/QN3
_tray_size4_987/CLK -> _tray_size4_987/QN1
_tray_size4_987/CLK -> _tray_size4_987/QN2
_tray_size4_987/CLK -> _tray_size4_987/QN0
_tray_size4_987/CLK -> _tray_size4_987/QN3
_tray_size4_988/CLK -> _tray_size4_988/QN1
_tray_size4_988/CLK -> _tray_size4_988/QN2
_tray_size4_988/CLK -> _tray_size4_988/QN0
_tray_size4_988/CLK -> _tray_size4_988/QN3
_tray_size4_990/CLK -> _tray_size4_990/QN1
_tray_size4_990/CLK -> _tray_size4_990/QN3
_tray_size4_990/CLK -> _tray_size4_990/QN2
_tray_size4_990/CLK -> _tray_size4_990/QN0
_tray_size4_995/CLK -> _tray_size4_995/QN3
_tray_size4_995/CLK -> _tray_size4_995/QN0
_tray_size4_995/CLK -> _tray_size4_995/QN1
_tray_size4_995/CLK -> _tray_size4_995/QN2
_tray_size4_996/CLK -> _tray_size4_996/QN1
_tray_size4_996/CLK -> _tray_size4_996/QN0
_tray_size4_996/CLK -> _tray_size4_996/QN3
_tray_size4_996/CLK -> _tray_size4_996/QN2
_tray_size4_997/CLK -> _tray_size4_997/QN0
_tray_size4_997/CLK -> _tray_size4_997/QN2
_tray_size4_997/CLK -> _tray_size4_997/QN3
_tray_size4_997/CLK -> _tray_size4_997/QN1
_tray_size4_998/CLK -> _tray_size4_998/QN1
_tray_size4_998/CLK -> _tray_size4_998/QN2
_tray_size4_998/CLK -> _tray_size4_998/QN3
_tray_size4_998/CLK -> _tray_size4_998/QN0
_tray_size4_999/CLK -> _tray_size4_999/QN2
_tray_size4_999/CLK -> _tray_size4_999/QN0
_tray_size4_999/CLK -> _tray_size4_999/QN3
_tray_size4_999/CLK -> _tray_size4_999/QN1
num changed arcs/tot arcs: 2602/71989, 3.6144410951673174%
num levels after topo sort: 50
def check(debug_file):
with open(debug_file, 'r') as f:
lines = f.readlines()
f.close()
diff_node_cnt = 0
for line in lines:
words = line.split()
src_inst = words[0].split('/')[0]
dst_inst = words[2].split('/')[0]
if src_inst != dst_inst:
print(line)
diff_node_cnt += 1
print(diff_node_cnt)
if __name__ == '__main__':
check('debug.log')
import numpy as np
import torch
import dgl
import os
import pickle
import re
import pdb
from utils import *
""" check the difference of timing arcs between different stages
1. dump DEF for different stages
2. parse by DREAMPlace
3. parse by this file
4. compare the timing graph
"""
def create_timing_graph(def_path, data_dir):
parse_inst2libcell_map(def_path, data_dir)
######## Load Data ########
node_names = np.load(os.path.join(data_dir, 'node_names.npy'))
node_x = np.load(os.path.join(data_dir, 'node_x.npy'))
node_y = np.load(os.path.join(data_dir, 'node_y.npy'))
pin_offset_x = np.load(os.path.join(data_dir, 'pin_offset_x.npy'))
pin_offset_y = np.load(os.path.join(data_dir, 'pin_offset_y.npy'))
pin_names_raw = np.load(os.path.join(data_dir, 'pin_names.npy'))
pin_direct = np.load(os.path.join(data_dir, 'pin_direct.npy'))
node2pin_map = np.load(os.path.join(data_dir, 'node2pin_map.npy'), allow_pickle=True)
net2pin_map = np.load(os.path.join(data_dir, 'net2pin_map.npy'), allow_pickle=True)
pin2node_map = np.load(os.path.join(data_dir, 'pin2node_map.npy'))
xl = 0
yl = 0
xh = 0
yh = 0
with open(os.path.join(data_dir, 'scalars.txt'), 'r') as f:
lines = f.readlines()
xl = float(lines[3].split()[1])
yl = float(lines[4].split()[1])
xh = float(lines[5].split()[1])
yh = float(lines[6].split()[1])
f.close()
node_name2id_map = None
with open(os.path.join(data_dir, 'node_name2id_map.pkl'), 'rb') as f:
node_name2id_map = pickle.load(f)
f.close()
inst2libcell_map = None
with open(os.path.join(data_dir, 'inst2libcell_map.pkl'), 'rb') as f:
inst2libcell_map = pickle.load(f)
f.close()
######## End Load Data ########
######## build timing arcs from placed def ########
timing_graph = TimingGraph(inst2libcell_map)
# wire arc
num_nets = net2pin_map.size
for ni in range(num_nets):
pins = net2pin_map[ni]
if pins.size <= 1:
continue
# find input/output pins
output_pins = []
input_pins = []
for pi in range(pins.size):
pin_idx = pins[pi]
if pin_direct[pin_idx] == b'OUTPUT':
output_pins.append(pin_idx)
else:
input_pins.append(pin_idx)
for op in output_pins:
# skip instances of tap cell
op_node_idx = pin2node_map[op]
if node2pin_map[op_node_idx].size <= 1:
if node_names[pin2node_map[op]] != pin_names_raw[op]:
# instance not in timing graph, e.g. TAP cell
continue
# else: is a port
if node_names[pin2node_map[op]] != pin_names_raw[op]:
op_full_name = node_names[pin2node_map[op]].decode() + '/' + pin_names_raw[op].decode()
else:
op_full_name = node_names[pin2node_map[op]].decode()
for ip in input_pins:
# skip instances of tap cell
ip_node_idx = pin2node_map[ip]
if node2pin_map[ip_node_idx].size <= 1:
if node_names[pin2node_map[ip]] != pin_names_raw[ip]:
# instance not in timing graph, e.g. TAP cell
continue
# else: is a port
if node_names[pin2node_map[ip]] != pin_names_raw[ip]:
ip_full_name = node_names[pin2node_map[ip]].decode() + '/' + pin_names_raw[ip].decode()
else:
ip_full_name = node_names[pin2node_map[ip]].decode()
timing_graph.add_arc(TimingArc(op_full_name, ip_full_name))
# cell arc
# there may be some pins of an instance not connected to any net
pin_valid = np.zeros(pin_names_raw.size, dtype=bool)
for ni in range(num_nets):
pins = net2pin_map[ni]
if pins.size <= 1:
continue
for pi in range(pins.size):
pin_valid[pins[pi]] = 1
num_nodes = node_names.size
for ni in range(num_nodes):
node_pins = node2pin_map[ni]
if node_pins.size <= 1: # port
continue
inst = node_names[ni].decode()
input_pins = []
output_pins = []
for pi in range(node_pins.size):
pin_idx = node_pins[pi]
if pin_valid[pin_idx]:
if pin_direct[pin_idx] == b'OUTPUT':
output_pins.append(pin_idx)
else:
input_pins.append(pin_idx)
libcell = inst2libcell_map[inst]
if 'FF' in libcell or 'LL' in libcell:
for ip in input_pins:
ip_full_name = node_names[pin2node_map[ip]].decode() + '/' + pin_names_raw[ip].decode()
if not 'D' in ip_full_name and not 'RESET' in ip_full_name and not 'SET' in ip_full_name:
for op in output_pins:
op_full_name = node_names[pin2node_map[op]].decode() + '/' + pin_names_raw[op].decode()
timing_graph.add_arc(TimingArc(ip_full_name, op_full_name))
else:
for ip in input_pins:
ip_full_name = node_names[pin2node_map[ip]].decode() + '/' + pin_names_raw[ip].decode()
for op in output_pins:
op_full_name = node_names[pin2node_map[op]].decode() + '/' + pin_names_raw[op].decode()
timing_graph.add_arc(TimingArc(ip_full_name, op_full_name))
######## End build timing arcs from placed def ########
return timing_graph
if __name__ == '__main__':
pdk = "asap7"
# tag = "limit_timing_opt"
tag = "no_timing_opt"
blocks = "aes".split()
raw_data_dir = f"/cyberpi/OpenROAD-flow-scripts/flow/parse/{pdk}"
# stage_tag = None
stage_tags = [None, 'final']
graphs = []
for block in blocks:
print(f'-------- {block} --------')
block_dir = os.path.join(raw_data_dir, tag, block)
for stage_tag in stage_tags:
if stage_tag == None:
def_path = os.path.join(block_dir, 'place.def')
data_dir = os.path.join(block_dir, 'parsed')
else:
def_path = os.path.join(block_dir, f'{stage_tag}.def')
data_dir = os.path.join(block_dir, 'parsed', stage_tag)
graph = create_timing_graph(def_path, data_dir)
graphs.append(graph)
srcdst2arc_maps = []
src2arc_maps = []
for graph in graphs:
srcdst2arc_maps.append(dict())
src2arc_maps.append(dict())
for arc in graph.all_arcs:
srcdst2arc_maps[-1][arc.src+' '+arc.dst] = arc
if arc.src not in src2arc_maps[-1]:
src2arc_maps[-1][arc.src] = []
src2arc_maps[-1][arc.src].append(arc)
place_pins = set()
for arc in graphs[0].all_arcs:
place_pins.add(arc.src)
place_pins.add(arc.dst)
# find the corresponding path in other stages
num_mismatch = 0
for arc in graphs[0].all_arcs:
chain, flag = dfs(arc.src, arc.dst, place_pins, src2arc_maps[1], True)
if not flag:
num_mismatch += 1
"""
num_mismatch = 0
for arc_key in srcdst2arc_maps[0]:
if arc_key not in srcdst2arc_maps[1]:
print(arc_key)
num_mismatch += 1
"""
print(f"num_mismatch: {num_mismatch}")
import numpy as np
import torch
import dgl
import os
import pickle
import re
import pdb
import gzip
import queue
from collections import defaultdict
from utils import *
class TreeNode:
def __init__(self, name):
self.name = name
self.children = []
self.parent = None
self.is_root = False
self.is_leaf = False
def check_legal(data_dir, parsed_libs_dir, parsed_sdf_dir, save_dir, block_name):
node_names = np.load(os.path.join(data_dir, 'node_names.npy'))
node_x = np.load(os.path.join(data_dir, 'node_x.npy'))
node_y = np.load(os.path.join(data_dir, 'node_y.npy'))
pin_offset_x = np.load(os.path.join(data_dir, 'pin_offset_x.npy'))
pin_offset_y = np.load(os.path.join(data_dir, 'pin_offset_y.npy'))
pin_names_raw = np.load(os.path.join(data_dir, 'pin_names.npy'))
pin_direct = np.load(os.path.join(data_dir, 'pin_direct.npy'))
node2pin_map = np.load(os.path.join(data_dir, 'node2pin_map.npy'), allow_pickle=True)
xl = 0
yl = 0
xh = 0
yh = 0
with open(os.path.join(data_dir, 'scalars.txt'), 'r') as f:
lines = f.readlines()
xl = float(lines[3].split()[1])
yl = float(lines[4].split()[1])
xh = float(lines[5].split()[1])
yh = float(lines[6].split()[1])
f.close()
node_name2id_map = None
with open(os.path.join(data_dir, 'node_name2id_map.pkl'), 'rb') as f:
node_name2id_map = pickle.load(f)
f.close()
inst2libcell_map = None
with open(os.path.join(data_dir, 'inst2libcell_map.pkl'), 'rb') as f:
inst2libcell_map = pickle.load(f)
f.close()
# check the timing paths in sdf, filter legal paths
# legal path:
# 1. FF's clk pin -> FF's D
# 2. FF's clk pin -> output port
# build trees with FF's clk
# delete the illegal leaf (not FF's D and not output port)
inst_time, pin_time = load_sdf_dict(parsed_sdf_dir)
lib_data, pin_caps = load_libdata(parsed_libs_dir)
sdf_pin_set = set()
src_pin2path_map = dict()
dst_pin2path_map = dict()
wire_paths = inst_time[block_name].interconnect
for path in wire_paths:
src_pin = path.src
dst_pin = path.dst
if not src_pin in src_pin2path_map:
src_pin2path_map[src_pin] = []
if not dst_pin in dst_pin2path_map:
dst_pin2path_map[dst_pin] = []
src_pin2path_map[src_pin].append(path)
dst_pin2path_map[dst_pin].append(path)
sdf_pin_set.add(src_pin)
sdf_pin_set.add(dst_pin)
for inst in inst_time:
if inst == block_name:
continue
cell_paths = inst_time[inst].iopath
for path in cell_paths:
src_pin = inst + '/' + path.src
dst_pin = inst + '/' + path.dst
if not src_pin in src_pin2path_map:
src_pin2path_map[src_pin] = []
path.src = src_pin
path.dst = dst_pin
src_pin2path_map[src_pin].append(path)
sdf_pin_set.add(src_pin)
sdf_pin_set.add(dst_pin)
# find all tree roots (FF's CLK)
tree_roots = set()
for src_pin in src_pin2path_map:
if len(src_pin.split('/')) == 1:
continue
src_inst_name = src_pin.split('/')[0]
if not src_inst_name in inst2libcell_map:
continue
src_libcell = inst2libcell_map[src_inst_name]
if not 'FF' in src_libcell:
continue
paths = src_pin2path_map[src_pin]
for path in paths:
dst_pin = path.dst
dst_inst_name = dst_pin.split('/')[0]
if not dst_inst_name in inst2libcell_map:
continue
dst_libcell = inst2libcell_map[dst_inst_name]
if 'FF' in dst_libcell:
tree_roots.add(src_pin)
break
# build trees for all those tree_roots
trees = dict()
tree_leafs = dict()
done_cnt = 0
illegal_leaves = set()
for root in tree_roots:
trees[root] = TreeNode(root)
trees[root].is_root = True
tree_leafs[root] = []
# use BFS
node_queue = queue.Queue()
node_queue.put(trees[root])
while not node_queue.empty():
node = node_queue.get()
if not node.name in src_pin2path_map:
node.is_leaf = True
tree_leafs[root].append(node)
if 'D' in node.name:
continue
if len(node.name.split('/')) == 1: # port
continue
last_cnt = len(illegal_leaves)
illegal_leaves.add(node.name)
if len(illegal_leaves) > last_cnt:
print(f"illegal cnt: {len(illegal_leaves)}, {node.name}")
continue
for path in src_pin2path_map[node.name]:
child_pin = path.dst
child = TreeNode(path.dst)
node.children.append(child)
node_queue.put(child)
done_cnt += 1
print(f'done_cnt/total: {done_cnt}/{len(tree_roots)}')
with open(os.path.join(save_dir, "illegal_leaves.pkl"), 'wb') as f:
pickle.dump(illegal_leaves, f)
f.close()
def create_graph5(data_dir, parsed_libs_dir, parsed_sdf_dir, save_dir, block_name):
node_names = np.load(os.path.join(data_dir, 'node_names.npy'))
node_x = np.load(os.path.join(data_dir, 'node_x.npy'))
node_y = np.load(os.path.join(data_dir, 'node_y.npy'))
pin_offset_x = np.load(os.path.join(data_dir, 'pin_offset_x.npy'))
pin_offset_y = np.load(os.path.join(data_dir, 'pin_offset_y.npy'))
pin_names_raw = np.load(os.path.join(data_dir, 'pin_names.npy'))
pin_direct = np.load(os.path.join(data_dir, 'pin_direct.npy'))
node2pin_map = np.load(os.path.join(data_dir, 'node2pin_map.npy'), allow_pickle=True)
xl = 0
yl = 0
xh = 0
yh = 0
with open(os.path.join(data_dir, 'scalars.txt'), 'r') as f:
lines = f.readlines()
xl = float(lines[3].split()[1])
yl = float(lines[4].split()[1])
xh = float(lines[5].split()[1])
yh = float(lines[6].split()[1])
f.close()
node_name2id_map = None
with open(os.path.join(data_dir, 'node_name2id_map.pkl'), 'rb') as f:
node_name2id_map = pickle.load(f)
f.close()
inst2libcell_map = None
with open(os.path.join(data_dir, 'inst2libcell_map.pkl'), 'rb') as f:
inst2libcell_map = pickle.load(f)
f.close()
# check the timing paths in sdf, filter legal paths
# legal path:
# 1. FF's clk pin -> FF's D
# 2. FF's clk pin -> output port
inst_time, pin_time = load_sdf_dict(parsed_sdf_dir)
lib_data, pin_caps = load_libdata(parsed_libs_dir)
# should only consider the cell edges related to wire edges
# both pins of a cell edge should occur in wire edge's pin set
# build wire edge's pin set
wire_path_pins = set()
valid_ports = set() # consider only output port
wire_paths = inst_time[block_name].interconnect
dst_pin2path_map = dict()
for path in wire_paths:
wire_path_pins.add(path.src)
wire_path_pins.add(path.dst)
if len(path.dst.split('/')) == 1:
valid_ports.add(path.dst)
dst_pin = path.dst
if not dst_pin in dst_pin2path_map:
dst_pin2path_map[dst_pin] = []
dst_pin2path_map[dst_pin].append(path)
valid_sdf_pins = wire_path_pins
# rename the cell path pins
for inst in inst_time:
if inst == block_name:
continue
cell_paths = inst_time[inst].iopath
for path in cell_paths:
src_pin = inst + '/' + path.src
dst_pin = inst + '/' + path.dst
path.src = src_pin
path.dst = dst_pin
# legal pin set is the intersection of pin set in placement and pin set in sdf file
num_place_nodes = node_names.size
place_pin_set = set()
for i in range(num_place_nodes):
node_name = node_names[i].decode()
pins = node2pin_map[i]
num_pins = pins.size
for pi in range(num_pins):
if node_name == pin_names_raw[pins[pi]].decode():
# this is a port, consider only output port
node_idx = node_name2id_map[node_name]
assert(node2pin_map[node_idx].size == 1)
port_idx = node2pin_map[node_idx][0]
if pin_direct[port_idx] == b'OUTPUT':
place_pin_set.add(node_name)
else:
pin_name = node_name + '/' + pin_names_raw[pins[pi]].decode()
place_pin_set.add(pin_name)
valid_pin_set = place_pin_set.intersection(valid_sdf_pins)
pin_name2graph_id_map = dict()
valid_pin_list = []
cnt = 0
for pin in valid_pin_set:
pin_name2graph_id_map[pin] = cnt
valid_pin_list.append(pin)
cnt += 1
num_edge_types = 8
edges = [[] for i in range(num_edge_types)]
edges_delay = [[] for i in range(num_edge_types)]
for inst in inst_time:
if inst == block_name:
continue
arcs = inst_time[inst].iopath
if not inst in inst2libcell_map:
continue
libcell = inst2libcell_map[inst]
if 'FF' in libcell: # type 0
for arc in arcs:
src = arc.src
dst = arc.dst
if not src in valid_pin_set or not dst in valid_pin_set:
continue
src_idx = pin_name2graph_id_map[src]
dst_idx = pin_name2graph_id_map[dst]
edges[0].append((src_idx, dst_idx))
edges_delay[0].append(arc.value)
else: # type 1
for arc in arcs:
src = arc.src
dst = arc.dst
if not src in valid_pin_set or not dst in valid_pin_set:
continue
src_idx = pin_name2graph_id_map[src]
dst_idx = pin_name2graph_id_map[dst]
edges[1].append((src_idx, dst_idx))
edges_delay[1].append(arc.value)
wires = inst_time[block_name].interconnect
for wire in wires:
if not wire.src in valid_pin_set or not wire.dst in valid_pin_set:
continue
src_idx = pin_name2graph_id_map[wire.src]
dst_idx = pin_name2graph_id_map[wire.dst]
dst_inst = wire.dst.split('/')[0]
dst_libcell = inst2libcell_map[dst_inst]
if 'FF' in dst_libcell: # type 4 & type5
edges[4].append((src_idx, dst_idx))
edges_delay[4].append(wire.value)
edges[5].append((dst_idx, src_idx))
# edges_delay[4].append(wire.value)
else:
dst_pin = valid_pin_list[dst_idx]
if len(dst_pin.split('/')) == 1:
# type 6 & type 7
edges[6].append((src_idx, dst_idx))
edges_delay[6].append(wire.value)
edges[7].append((dst_idx, src_idx))
# edges_delay[7].append(wire.value)
else:
# type 2 & type 3
edges[2].append((src_idx, dst_idx))
edges_delay[2].append(wire.value)
edges[3].append((dst_idx, src_idx))
# edges_delay[3].append(wire.value)
# build graph node's features
# is fanin (0) or fanout (1)
num_pins = len(valid_pin_list)
faninfanout = np.zeros(num_pins)
for edge in edges[0]:
faninfanout[edge[1]] = 1
for edge in edges[2]:
faninfanout[edge[0]] = 1
for edge in edges[4]:
faninfanout[edge[0]] = 1
for edge in edges[6]:
faninfanout[edge[0]] = 1
is_primary_io_pin = np.zeros(num_pins)
for edge in edges[6]:
is_primary_io_pin[edge[1]] = 1
# timing endpoint: output port or FF's 'D' pin
is_timing_endpoint = np.zeros(num_pins)
for i in range(num_pins):
pin_name = valid_pin_list[i]
if len(pin_name.split('/')) == 1: # port
is_primary_io_pin[i] = 1
node_name = pin_name
place_node_id = node_name2id_map[node_name]
assert(node2pin_map[place_node_id].size == 1)
place_pin_id = node2pin_map[place_node_id][0]
if pin_direct[place_node_id] == b'OUTPUT':
is_timing_endpoint[i] = 1
else: # normal instance's pin
node_name = pin_name.split('/')[0]
libcell = inst2libcell_map[node_name]
if 'FF' in libcell: # judge FF by name
node_pin_name = pin_name.split('/')[1]
if 'D' in node_pin_name:
is_timing_endpoint[i] = 1
net_delays_at_fanin = np.zeros((num_pins, 4))
for dst_pin in dst_pin2path_map:
if not dst_pin in valid_pin_set:
continue
graph_node_id = pin_name2graph_id_map[dst_pin]
for delay in dst_pin2path_map[dst_pin]:
net_delays_at_fanin[graph_node_id] = np.maximum(delay.value, net_delays_at_fanin[graph_node_id])
pin_loc = np.zeros((num_pins, 4))
for i in range(num_pins):
pin_name = valid_pin_list[i]
inst_name = pin_name.split('/')[0]
place_node_id = node_name2id_map[inst_name]
place_node_x = node_x[place_node_id]
place_node_y = node_y[place_node_id]
place_node_pins = node2pin_map[place_node_id]
if inst_name == pin_name: # port
assert(place_node_pins.size == 1)
place_node_pin_id = place_node_pins[0]
else:
num_node_pins = place_node_pins.size
for pi in range(num_node_pins):
place_node_pin_id = place_node_pins[pi]
place_node_pin_name = pin_names_raw[place_node_pin_id].decode()
if pin_name.split('/')[1] == place_node_pin_name:
break
place_pin_x_off = pin_offset_x[place_node_pin_id]
place_pin_y_off = pin_offset_y[place_node_pin_id]
pin_x = place_node_x + place_pin_x_off
pin_y = place_node_y + place_pin_y_off
pin_loc[i] = np.array([pin_x - xl, pin_y - yl, xh - pin_x, yh - pin_y])
# fill data to graph
ndata = dict()
ndata["n_rats"] = torch.zeros(num_pins, 4)
ndata["n_ats"] = torch.zeros(num_pins, 4)
ndata["n_slews"] = torch.zeros(num_pins, 4)
ndata["n_net_delays"] = torch.from_numpy(net_delays_at_fanin).float()
ndata["nf"] = torch.zeros(num_pins, 10)
ndata["n_is_timing_endpt"] = torch.from_numpy(is_timing_endpoint).float()
for pi in range(num_pins):
pin_name = valid_pin_list[pi]
ndata["n_rats"][pi] = torch.from_numpy(pin_time[pin_name].rat)
ndata["n_ats"][pi] = torch.from_numpy(pin_time[pin_name].at)
ndata["n_slews"][pi] = torch.from_numpy(pin_time[pin_name].slew)
ndata['nf'][pi][0] = is_primary_io_pin[pi]
ndata['nf'][pi][1] = faninfanout[pi]
ndata['nf'][pi][2:6] = torch.from_numpy(pin_loc[pi])
# cap data
if is_primary_io_pin[pi]:
ndata["nf"][pi][6:10] = torch.zeros(4)
else:
inst = pin_name.split('/')[0]
pin_name_str = pin_name.split('/')[1]
celltype = inst2libcell_map[inst]
cap_data = np.zeros(4)
cap_data[0] = pin_caps['fast'][celltype][pin_name_str]['rise_capacitance']
cap_data[1] = pin_caps['fast'][celltype][pin_name_str]['fall_capacitance']
cap_data[2] = pin_caps['slow'][celltype][pin_name_str]['rise_capacitance']
cap_data[3] = pin_caps['slow'][celltype][pin_name_str]['fall_capacitance']
ndata["nf"][pi][6:10] = torch.from_numpy(cap_data)
edges_features = [[] for i in range(num_edge_types)]
for edge in edges[0]:
src = edge[0]
dst = edge[1]
src_pin = valid_pin_list[src]
dst_pin = valid_pin_list[dst]
inst = src_pin.split('/')[0]
assert(inst == dst_pin.split('/')[0])
path_key = dst_pin.split('/')[1] + '/' + src_pin.split('/')[1]
celltype = inst2libcell_map[inst]
ef = np.zeros(512)
ef[:4*15] = lib_data['fast'][celltype][path_key][:4*15]
ef[4*15 : 2*4*15] = lib_data['slow'][celltype][path_key][:4*15]
ef[2*4*15 : 2*4*15+4*49] = lib_data['fast'][celltype][path_key][-4*49:]
ef[-4*49:] = lib_data['slow'][celltype][path_key][-4*49:]
edges_features[0].append(ef)
for edge in edges[1]:
src = edge[0]
dst = edge[1]
src_pin = valid_pin_list[src]
dst_pin = valid_pin_list[dst]
inst = src_pin.split('/')[0]
assert(inst == dst_pin.split('/')[0])
path_key = dst_pin.split('/')[1] + '/' + src_pin.split('/')[1]
celltype = inst2libcell_map[inst]
ef = np.zeros(512)
ef[:4*15] = lib_data['fast'][celltype][path_key][:4*15]
ef[4*15 : 2*4*15] = lib_data['slow'][celltype][path_key][:4*15]
ef[2*4*15 : 2*4*15+4*49] = lib_data['fast'][celltype][path_key][-4*49:]
ef[-4*49:] = lib_data['slow'][celltype][path_key][-4*49:]
edges_features[1].append(ef)
for edge in edges[2]:
src = edge[0]
dst = edge[1]
srcx = pin_loc[src][0] + xl
srcy = pin_loc[src][1] + yl
dstx = pin_loc[dst][0] + xl
dsty = pin_loc[dst][1] + yl
ef = np.array([dstx - srcx, dsty - srcy])
edges_features[2].append(ef)
edges_features[3].append(-ef)
for edge in edges[4]:
src = edge[0]
dst = edge[1]
srcx = pin_loc[src][0] + xl
srcy = pin_loc[src][1] + yl
dstx = pin_loc[dst][0] + xl
dsty = pin_loc[dst][1] + yl
ef = np.array([dstx - srcx, dsty - srcy])
edges_features[4].append(ef)
edges_features[5].append(-ef)
for edge in edges[6]:
src = edge[0]
dst = edge[1]
srcx = pin_loc[src][0] + xl
srcy = pin_loc[src][1] + yl
dstx = pin_loc[dst][0] + xl
dsty = pin_loc[dst][1] + yl
ef = np.array([dstx - srcx, dsty - srcy])
edges_features[6].append(ef)
edges_features[7].append(-ef)
# build graph with 3 types of edges: cell_out, net_out, net_in
# cell_out = clk2q + in2out
# net_out = fanout2fanin + fanout2d + _2outport
# net_in = fanin2fanout + d2fanout + outport2_
g = dgl.heterograph({
# for reference
('node', 'clk2q', 'node'): edges[0],
('node', 'in2out', 'node'): edges[1],
('node', 'fanout2fanin', 'node'): edges[2],
('node', 'fanin2fanout', 'node'): edges[3],
('node', 'fanout2d', 'node'): edges[4],
('node', 'd2fanout', 'node'): edges[5],
('node', '_2outport', 'node'): edges[6],
('node', 'outport2_', 'node'): edges[7],
# need to fill data
('node', 'cell_out', 'node'): edges[0] + edges[1],
('node', 'net_out', 'node'): edges[2] + edges[4] + edges[6],
('node', 'net_in', 'node'): edges[3] + edges[5] + edges[7],
})
g.ndata['n_rats'] = ndata['n_rats'].float()
g.ndata['n_ats'] = ndata['n_ats'].float()
g.ndata['n_slews'] = ndata['n_slews'].float()
g.ndata['nf'] = ndata['nf'].float()
g.ndata['n_is_timing_endpt'] = ndata['n_is_timing_endpt'].float()
g.edges['clk2q'].data['e_delay'] = torch.tensor(edges_delay[0]).float()
g.edges['clk2q'].data['ef'] = torch.tensor(edges_features[0]).float()
g.edges['in2out'].data['e_delay'] = torch.tensor(edges_delay[1]).float()
g.edges['in2out'].data['ef'] = torch.tensor(edges_features[1]).float()
g.edges['fanout2fanin'].data['e_delay'] = torch.tensor(edges_delay[2]).float()
g.edges['fanout2fanin'].data['ef'] = torch.tensor(edges_features[2]).float()
# g.edges['fanin2fanout'].data['e_delay'] = torch.tensor(edges_delay[3]).float()
g.edges['fanin2fanout'].data['ef'] = torch.tensor(edges_features[3]).float()
g.edges['fanout2d'].data['e_delay'] = torch.tensor(edges_delay[4]).float()
g.edges['fanout2d'].data['ef'] = torch.tensor(edges_features[4]).float()
# g.edges['d2fanout'].data['e_delay'] = torch.tensor(edges_delay[5]).float()
g.edges['d2fanout'].data['ef'] = torch.tensor(edges_features[5]).float()
g.edges['_2outport'].data['e_delay'] = torch.tensor(edges_delay[6]).float()
g.edges['_2outport'].data['ef'] = torch.tensor(edges_features[6]).float()
# g.edges['outport2_'].data['e_delay'] = torch.tensor(edges_delay[7]).float()
g.edges['outport2_'].data['ef'] = torch.tensor(edges_features[7]).float()
g.edges['cell_out'].data['e_delay'] = torch.tensor(edges_delay[0] + edges_delay[1]).float()
g.edges['cell_out'].data['ef'] = torch.tensor(edges_features[0] + edges_features[1]).float()
g.edges['net_out'].data['e_delay'] = torch.tensor(edges_delay[2] + edges_delay[4]).float()
g.edges['net_out'].data['ef'] = torch.tensor(edges_features[2] + edges_features[4]).float()
# g.edges['net_in'].data['e_delay'] = torch.tensor(edges_delay[3] + edges_delay[5]).float()
g.edges['net_in'].data['ef'] = torch.tensor(edges_features[3] + edges_features[5]).float()
dgl.save_graphs(os.path.join(save_dir, f'{block_name}.2.graph.bin'), [g])
g_hetero = g
na, nb = g_hetero.edges(etype='fanout2fanin', form='uv')
ca, cb = g_hetero.edges(etype='in2out', form='uv')
pa, pb = g_hetero.edges(etype='_2outport', form='uv')
fa, fb = g_hetero.edges(etype='fanout2d', form='uv')
g = dgl.graph((torch.cat([na, ca, pa, fa]).cpu(), torch.cat([nb, cb, pb, fb]).cpu()))
topo = dgl.topological_nodes_generator(g) # this seems like topo-sort
pdb.set_trace()
class SimpleGraph:
def __init__(self, vertices):
self.V = vertices
self.graph = defaultdict(list)
self.Time = 0
self.loops = []
def addEdge(self, u, v):
self.graph[u].append(v)
'''A recursive function that find finds and prints strongly connected
components using DFS traversal
u --> The vertex to be visited next
disc[] --> Stores discovery times of visited vertices
low[] -- >> earliest visited vertex (the vertex with minimum
discovery time) that can be reached from subtree
rooted with current vertex
st -- >> To store all the connected ancestors (could be part
of SCC)
stackMember[] --> bit/index array for faster check whether
a node is in stack
'''
def SCCUtil(self, u, low, disc, stackMember, st):
# Initialize discovery time and low value
disc[u] = self.Time
low[u] = self.Time
self.Time += 1
stackMember[u] = True
st.append(u)
# Go through all vertices adjacent to this
for v in self.graph[u]:
# If v is not visited yet, then recur for it
if disc[v] == -1:
self.SCCUtil(v, low, disc, stackMember, st)
# Check if the subtree rooted with v has a connection to
# one of the ancestors of u
# Case 1 (per above discussion on Disc and Low value)
low[u] = min(low[u], low[v])
elif stackMember[v] == True:
'''Update low value of 'u' only if 'v' is still in stack
(i.e. it's a back edge, not cross edge).
Case 2 (per above discussion on Disc and Low value) '''
low[u] = min(low[u], disc[v])
# head node found, pop the stack and print an SCC
w = -1 # To store stack extracted vertices
sub_set = []
if low[u] == disc[u]:
while w != u:
w = st.pop()
sub_set.append(w)
stackMember[w] = False
if len(sub_set) > 1:
print(sub_set)
self.loops.append(sub_set)
# The function to do DFS traversal.
# It uses recursive SCCUtil()
def SCC(self):
# Mark all the vertices as not visited
# and Initialize parent and visited,
# and ap(articulation point) arrays
disc = [-1] * (self.V)
low = [-1] * (self.V)
stackMember = [False] * (self.V)
st = []
# Call the recursive helper function
# to find articulation points
# in DFS tree rooted with vertex 'i'
for i in range(self.V):
if disc[i] == -1:
self.SCCUtil(i, low, disc, stackMember, st)
# https://www.geeksforgeeks.org/tarjan-algorithm-find-strongly-connected-components/
def detect_loops(edges, num_nodes):
g = SimpleGraph(num_nodes)
num_edges = edges[0].size(0)
for i in range(num_edges):
g.addEdge(edges[0][i].item(), edges[1][i].item())
g.SCC()
return g.loops
def simple_dfs_core(node, target, pin_map):
if not node in pin_map:
return [], False
if node == target:
return [node], True
dsts = pin_map[node]
for dst in dsts:
chain, flag = simple_dfs_core(dst, target, pin_map)
if flag:
chain.append(node)
return chain, flag
return [], False
# check if node in a loop
def simple_dfs(node, pin_map):
dsts = pin_map[node]
for dst in dsts:
chain, flag = simple_dfs_core(dst, node, pin_map)
if flag:
return chain, True
return [], False
def create_graph6(data_dir, parsed_libs_dir, parsed_sdf_dir, save_dir, block_name):
######## Load Data ########
node_names = np.load(os.path.join(data_dir, 'node_names.npy'))
node_x = np.load(os.path.join(data_dir, 'node_x.npy'))
node_y = np.load(os.path.join(data_dir, 'node_y.npy'))
pin_offset_x = np.load(os.path.join(data_dir, 'pin_offset_x.npy'))
pin_offset_y = np.load(os.path.join(data_dir, 'pin_offset_y.npy'))
pin_names_raw = np.load(os.path.join(data_dir, 'pin_names.npy'))
pin_direct = np.load(os.path.join(data_dir, 'pin_direct.npy'))
node2pin_map = np.load(os.path.join(data_dir, 'node2pin_map.npy'), allow_pickle=True)
net2pin_map = np.load(os.path.join(data_dir, 'net2pin_map.npy'), allow_pickle=True)
pin2node_map = np.load(os.path.join(data_dir, 'pin2node_map.npy'))
xl = 0
yl = 0
xh = 0
yh = 0
with open(os.path.join(data_dir, 'scalars.txt'), 'r') as f:
lines = f.readlines()
xl = float(lines[3].split()[1])
yl = float(lines[4].split()[1])
xh = float(lines[5].split()[1])
yh = float(lines[6].split()[1])
f.close()
node_name2id_map = None
with open(os.path.join(data_dir, 'node_name2id_map.pkl'), 'rb') as f:
node_name2id_map = pickle.load(f)
f.close()
inst2libcell_map = None
with open(os.path.join(data_dir, 'inst2libcell_map.pkl'), 'rb') as f:
inst2libcell_map = pickle.load(f)
f.close()
inst_time, pin_time = load_sdf_dict(parsed_sdf_dir)
lib_data, pin_caps = load_libdata(parsed_libs_dir)
######## End Load Data ########
######## build timing arcs from placed def ########
timing_graph = TimingGraph(inst2libcell_map)
# wire arc
num_nets = net2pin_map.size
for ni in range(num_nets):
pins = net2pin_map[ni]
if pins.size <= 1:
continue
# find input/output pins
output_pins = []
input_pins = []
for pi in range(pins.size):
pin_idx = pins[pi]
if pin_direct[pin_idx] == b'OUTPUT':
output_pins.append(pin_idx)
else:
input_pins.append(pin_idx)
for op in output_pins:
# skip instances of tap cell
op_node_idx = pin2node_map[op]
if node2pin_map[op_node_idx].size <= 1:
if node_names[pin2node_map[op]] != pin_names_raw[op]:
# instance not in timing graph, e.g. TAP cell
continue
# else: is a port
if node_names[pin2node_map[op]] != pin_names_raw[op]:
op_full_name = node_names[pin2node_map[op]].decode() + '/' + pin_names_raw[op].decode()
else:
op_full_name = node_names[pin2node_map[op]].decode()
for ip in input_pins:
# skip instances of tap cell
ip_node_idx = pin2node_map[ip]
if node2pin_map[ip_node_idx].size <= 1:
if node_names[pin2node_map[ip]] != pin_names_raw[ip]:
# instance not in timing graph, e.g. TAP cell
continue
# else: is a port
if node_names[pin2node_map[ip]] != pin_names_raw[ip]:
ip_full_name = node_names[pin2node_map[ip]].decode() + '/' + pin_names_raw[ip].decode()
else:
ip_full_name = node_names[pin2node_map[ip]].decode()
timing_graph.add_arc(TimingArc(op_full_name, ip_full_name))
# cell arc
# there may be some pins of an instance not connected to any net
pin_valid = np.zeros(pin_names_raw.size, dtype=bool)
for ni in range(num_nets):
pins = net2pin_map[ni]
if pins.size <= 1:
continue
for pi in range(pins.size):
pin_valid[pins[pi]] = 1
num_nodes = node_names.size
for ni in range(num_nodes):
node_pins = node2pin_map[ni]
if node_pins.size <= 1: # port
continue
inst = node_names[ni].decode()
input_pins = []
output_pins = []
for pi in range(node_pins.size):
pin_idx = node_pins[pi]
if pin_valid[pin_idx]:
if pin_direct[pin_idx] == b'OUTPUT':
output_pins.append(pin_idx)
else:
input_pins.append(pin_idx)
libcell = inst2libcell_map[inst]
if 'FF' in libcell or 'LL' in libcell:
for ip in input_pins:
ip_full_name = node_names[pin2node_map[ip]].decode() + '/' + pin_names_raw[ip].decode()
if not 'D' in ip_full_name and not 'RESET' in ip_full_name and not 'SET' in ip_full_name:
for op in output_pins:
op_full_name = node_names[pin2node_map[op]].decode() + '/' + pin_names_raw[op].decode()
timing_graph.add_arc(TimingArc(ip_full_name, op_full_name))
else:
for ip in input_pins:
ip_full_name = node_names[pin2node_map[ip]].decode() + '/' + pin_names_raw[ip].decode()
for op in output_pins:
op_full_name = node_names[pin2node_map[op]].decode() + '/' + pin_names_raw[op].decode()
timing_graph.add_arc(TimingArc(ip_full_name, op_full_name))
######## End build timing arcs from placed def ########
######## find timing info ########
# init placement pins
# we assume that during timing opt, tools only assert buffer and do NOT change the logic
place_pins = set()
for arc in timing_graph.all_arcs:
place_pins.add(arc.src)
place_pins.add(arc.dst)
# init all timing arcs found in sdf
src_pin2path_map = dict()
# wire paths
wire_paths = inst_time[block_name].interconnect
for path in wire_paths:
if not path.src in src_pin2path_map:
src_pin2path_map[path.src] = []
src_pin2path_map[path.src].append(path)
for inst in inst_time:
if inst == block_name:
continue
cell_paths = inst_time[inst].iopath
for path in cell_paths:
src_pin = inst + '/' + path.src
dst_pin = inst + '/' + path.dst
path.src = src_pin
path.dst = dst_pin
if not path.src in src_pin2path_map:
src_pin2path_map[path.src] = []
src_pin2path_map[path.src].append(path)
success_arc = dict()
failed_cnt = 0
for arc in timing_graph.all_arcs:
try:
chain, flag = dfs(arc.src, arc.dst, place_pins, src_pin2path_map, first_call=True)
# NOTE: it seems that here the node has logistic opt
# e.g. for aes, in placement def: _30368_/SN -> _29055_/A
# but in sdf, _30368_/SN -> rebuffer1/A -> rebuffer1/Y -> rebuffer2/A -> rebuffer2/Y -> _29055_/B
# connect to another input pin of the same instance
# solutions:
# 1. ban logic opt in OpenROAD flow (how?)
# 2. skip those paths with logic changes
if not flag:
failed_cnt += 1
print(f"{arc.src} -> {arc.dst}")
else:
success_arc[arc] = chain
except:
failed_cnt += 1
print(f"{arc.src} -> {arc.dst}")
print(f'num changed arcs/tot arcs: {failed_cnt}/{len(timing_graph.all_arcs)}, {failed_cnt / len(timing_graph.all_arcs) * 100}%')
# fill in successful timing arc
for arc, chain in success_arc.items():
chain.reverse()
delay = np.zeros(4)
for path in chain:
# NOTE: this assume that the path has only buffers inserted,
# and each buffer has only one input and one output
delay += path.value # is it right??
rebuild = False
if rebuild:
# ignore those successful timing arc
new_timing_graph = TimingGraph(inst2libcell_map)
for arc in success_arc:
new_timing_graph.add_arc(arc)
# rebuild place pins
place_pins = set()
for arc in new_timing_graph.all_arcs:
place_pins.add(arc.src)
place_pins.add(arc.dst)
# replace the old timing_graph
timing_graph = new_timing_graph
######## End find timing info ########
######## build DGL graph ########
place_pin2id_map = dict()
place_pins_list = []
pin_cnt = 0
for pin in place_pins:
place_pin2id_map[pin] = pin_cnt
place_pins_list.append(pin)
pin_cnt += 1
# pin attributes
faninfanout = np.zeros(pin_cnt) # fanin:(0), fanout (1)
is_primary_io_pin = np.zeros(pin_cnt)
is_timing_endpoint = np.zeros(pin_cnt) # FF's D or output port
for arc in timing_graph.all_arcs:
# find fanout (only cell pins)
types = {'q2outport', 'out2outport', 'q2in', 'out2in', 'out2d', 'q2d'}
if arc.type in types:
pin_id = place_pin2id_map[arc.src]
faninfanout[pin_id] = 1
# find primary_io_pin
types = {'inport2d', 'inport2clk', 'inport2pin', 'inport2outport'}
if arc.type in types:
pin_id = place_pin2id_map[arc.src]
is_primary_io_pin[pin_id] = 1
types = {'inport2outport', 'q2outport', 'out2outport'}
if arc.type in types:
pin_id = place_pin2id_map[arc.dst]
is_primary_io_pin[pin_id] = 1
# find tming_endpoint
types = {'inport2outport', 'q2outport', 'out2outport', 'out2d', 'q2d', 'inport2d'}
if arc.type in types:
pin_id = place_pin2id_map[arc.dst]
is_timing_endpoint[pin_id] = 1
# build edges
edges = dict()
for arc_type in timing_arc_types:
edges[arc_type] = []
for arc in timing_graph.all_arcs:
edges[arc.type].append(
(place_pin2id_map[arc.src], place_pin2id_map[arc.dst]))
# for GNN: cell_out, net_out, net_in
dgl_edge_types = dict()
dgl_edge_types['cell_out'] = ['clk2q', 'in2out']
dgl_edge_types['net_out'] = [
'inport2d', 'inport2clk', 'inport2in',
'q2outport', 'out2outport', 'inport2outport',
'q2in', 'out2in', 'out2d', 'q2d']
# type net_in is a reverse of net_out's src and dst
# build DGL edge types
for arc_type, types in dgl_edge_types.items():
edges[arc_type] = []
for merge_type in types:
edges[arc_type] += edges[merge_type]
g = dgl.heterograph({
('node', 'net_out', 'node'): edges['net_out'],
('node', 'cell_out', 'node'): edges['cell_out'],
})
# test
try:
g_hetero = g
na, nb = g_hetero.edges(etype='net_out', form='uv')
ca, cb = g_hetero.edges(etype='cell_out', form='uv')
g = dgl.graph((torch.cat([na, ca]).cpu(), torch.cat([nb, cb]).cpu()))
topo = dgl.topological_nodes_generator(g) # this seems like topo-sort
print(f'num levels after topo sort: {len(topo)}')
detect_loops(g.edges(), pin_cnt)
except Exception as e:
print(e)
print('graph has loops')
# NOTE: error occurs due to loops
# TODO: find the loop
loops = detect_loops(g.edges(), pin_cnt)
src_pin2path_map_place = dict()
for arc in timing_graph.all_arcs:
if not arc.src in src_pin2path_map_place:
src_pin2path_map_place[arc.src] = []
src_pin2path_map_place[arc.src].append(arc)
# build the loop
for loop in loops:
loop_pins = set()
for pin in loop:
loop_pins.add(pin)
visited = set()
pin_map = dict() # src -> dst
for pin in loop:
if pin in visited:
continue
visited.add(pin)
pin_name = place_pins_list[pin]
pin_map[pin_name] = []
paths = src_pin2path_map_place[pin_name]
for path in paths:
if place_pin2id_map[path.dst] in loop_pins:
visited.add(place_pin2id_map[path.dst])
pin_map[pin_name].append(path.dst)
for key in pin_map:
chain, flag = simple_dfs(key, pin_map)
if flag:
print("OK!")
pdb.set_trace()
pdb.set_trace()
######## End build DGL graph ########
######## fill data into graph ########
######## End fill data into graph ########
######## save graph ########
######## End save graph ########
if __name__ == '__main__':
pdk = "asap7"
# tag = "with_wc_libs"
# tag = "limit_timing_opt"
tag = "no_timing_opt"
# blocks = "aes".split()
# blocks = "aes aes-mbff ethmac gcd ibex jpeg mock-alu uart".split()
blocks = "aes aes-mbff gcd ibex jpeg uart".split()
# with bugs:
# blocks = "ethmac mock-alu".split()
# blocks = "ethmac".split()
# blocks = "mock-alu".split()
raw_data_dir = f"/cyberpi/OpenROAD-flow-scripts/flow/parse/{pdk}"
techlib_dir = os.path.join(raw_data_dir, "techlib")
do_parse_libs = 0
do_parse_sdf = 1
do_parse_inst2cell_map = 1
if do_parse_libs:
all_libs = os.listdir(os.path.join(techlib_dir, "lib"))
fast_libs = []
slow_libs = []
for lib in all_libs:
if '.swp' in lib:
continue
if '_FF_' in lib:
fast_libs.append(os.path.join(techlib_dir, "lib", lib))
elif '_SS_' in lib:
slow_libs.append(os.path.join(techlib_dir, "lib", lib))
elif 'fake' in lib or 'FAKE' in lib:
fast_libs.append(os.path.join(techlib_dir, "lib", lib))
slow_libs.append(os.path.join(techlib_dir, "lib", lib))
libs = {}
libs['fast'] = fast_libs
libs['slow'] = slow_libs
save_dir = os.path.join(techlib_dir, "parsed_lib")
parse_libs(libs, save_dir)
for block in blocks:
print(f'-------- {block} --------')
block_dir = os.path.join(raw_data_dir, tag, block)
if do_parse_inst2cell_map:
save_dir = os.path.join(block_dir, 'parsed')
os.makedirs(save_dir, exist_ok=True)
parse_inst2libcell_map(os.path.join(block_dir, 'place.def'), save_dir)
if do_parse_sdf:
sdf_file = os.path.join(block_dir, f'{block}.at.sdf')
save_dir = os.path.join(block_dir, 'parsed')
os.makedirs(save_dir, exist_ok=True)
parse_sdf(sdf_file, block, save_dir)
data_dir = os.path.join(block_dir, 'parsed')
save_dir = os.path.join(block_dir, 'parsed')
sdf_dir = os.path.join(block_dir, 'parsed')
lib_dir = os.path.join(techlib_dir, 'parsed_lib')
# NOTE: skip error blocks
# error_blocks = {'ethmac', 'ibex', 'jpeg', 'mock-alu'}
# if block in error_blocks:
# print('skip')
# continue
# check_legal(data_dir, lib_dir, sdf_dir, save_dir, block)
create_graph6(data_dir, lib_dir, sdf_dir, save_dir, block)
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
import numpy as np
import torch
import dgl
import os
import pickle
import re
import pdb
import gzip
import queue
from collections import defaultdict
from liberty.parser import parse_liberty
from liberty.types import *
class Delay:
def __init__(self, src, dst, val):
self.src = src
self.dst = dst
self.value = val
class CellDelay:
def __init__(self):
self.celltype = None
self.inst = None
self.interconnect = []
self.iopath = []
self.isFF = False # deprecate this
class ArrivalTime:
def __init__(self):
self.at = None
self.slew = None
self.rat = None
def parse_sdf(sdf_file, block_name, save_dir):
lines = None
with open(sdf_file, 'r') as f:
lines = f.readlines()
f.close()
# TODO: deal with FF
# e.g. inst '_73818_' of celltype 'sky130_fd_sc_hd__dfxtp_1' in block 'aes128'
inst_time = dict()
# get all insts
for line in lines:
words = line.split()
if words[0] == "(INSTANCE)":
inst_time[block_name] = CellDelay()
elif words[0] == "(INSTANCE":
inst_time[words[1][:-1]] = CellDelay()
print(f"num insts: {len(inst_time)}")
pin_time = dict()
invalid_cnt = 0
tot_cnt = 0
num_lines = len(lines)
for li in range(num_lines):
line = lines[li]
# parse CELL field
words = line.split()
if words[0] == "(CELL":
cell_type = lines[li + 1].split()[-1][1:-2]
inst = lines[li + 2].split()[-1][:-1]
if len(lines[li + 2].split()) == 1:
inst = block_name
inst_time[inst].celltype = cell_type
inst_time[inst].inst = inst
li += 5
while True:
line = lines[li]
li += 1
words = line.split()
if words[0] == ')':
break
elif words[0] == "(INTERCONNECT":
src = words[1]
dst = words[2]
if src == "VGND" or src == 'VPWR' or dst == "VGND" or dst == "VPWR":
continue
else:
numbers = words[-2] + words[-1]
# pat = r'\d+\.\d+|\d+' # find all floating numbers
pat = r'\d+\.\d+' # find all floating numbers
vals_str = re.findall(pat, numbers)
vals = []
for vs in vals_str:
vals.append(float(vs))
tot_cnt += 1
if len(vals) != 4:
# I don't know why there are some lines has only 2 values
# open sta shows that max/min rise/fall values are the same
if len(vals) != 2:
invalid_cnt += 1
print(line)
continue
vals.append(vals[0])
vals.append(vals[1])
# inst_time[inst].interconnect.append(
# Delay(src, dst, np.array(vals, dtype=np.double))
# )
# make it like the DAC22's paper
vals_np = np.zeros(4, dtype=np.double)
vals_np[0] = vals[0]
vals_np[1] = vals[2]
vals_np[2] = vals[1]
vals_np[3] = vals[3]
inst_time[inst].interconnect.append(
Delay(src, dst, vals_np)
)
elif words[0] == "(IOPATH":
src = words[1]
dst = words[2]
if src == "VGND" or src == 'VPWR' or dst == "VGND" or dst == "VPWR":
continue
else:
numbers = words[-2] + words[-1]
# pat = r'\d+\.\d+|\d+' # find all floating numbers
pat = r'\d+\.\d+' # find all floating numbers
vals_str = re.findall(pat, numbers)
vals = []
for vs in vals_str:
vals.append(float(vs))
tot_cnt += 1
if len(vals) != 4:
if len(vals) != 2:
invalid_cnt += 1
print(line)
continue
vals.append(vals[0])
vals.append(vals[1])
# inst_time[inst].iopath.append(
# Delay(src, dst, np.array(vals, dtype=np.double))
# )
# make it like the DAC22's paper
vals_np = np.zeros(4, dtype=np.double)
vals_np[0] = vals[0]
vals_np[1] = vals[2]
vals_np[2] = vals[1]
vals_np[3] = vals[3]
inst_time[inst].iopath.append(
Delay(src, dst, vals_np)
)
# parse ARRIVALTIMES field
elif words[0] == "(ARRIVALTIMES":
li += 1
while True:
line = lines[li]
li += 1
words = line.split()
if words[0] == ')':
break
elif words[0] == "(AT":
pin_name = words[1]
if pin_name == "VGND" or pin_name == "VPER":
continue
numbers = words[-2] + words[-1]
# pat = r'\d+\.\d+|\d+' # find all floating numbers
pat = r'\d+\.\d+' # find all floating numbers
vals_str = re.findall(pat, numbers)
vals = []
for vs in vals_str:
vals.append(float(vs))
assert(len(vals) == 4)
# make it like the DAC22's paper
vals_np = np.zeros(4, dtype=np.double)
vals_np[0] = vals[0]
vals_np[1] = vals[2]
vals_np[2] = vals[1]
vals_np[3] = vals[3]
if not pin_name in pin_time:
pin_time[pin_name] = ArrivalTime()
# pin_time[pin_name].at = np.array(vals, dtype=np.double)
pin_time[pin_name].at = vals_np
elif words[0] == "(SLEW":
pin_name = words[1]
if pin_name == "VGND" or pin_name == "VPER":
continue
numbers = words[-2] + words[-1]
pat = r'\d+\.\d+|\d+' # find all floating numbers
vals_str = re.findall(pat, numbers)
vals = []
for vs in vals_str:
vals.append(float(vs))
assert(len(vals) == 4)
# make it like the DAC22's paper
vals_np = np.zeros(4, dtype=np.double)
vals_np[0] = vals[0]
vals_np[1] = vals[2]
vals_np[2] = vals[1]
vals_np[3] = vals[3]
if not pin_name in pin_time:
pin_time[pin_name] = ArrivalTime()
# pin_time[pin_name].slew = np.array(vals, dtype=np.double)
pin_time[pin_name].slew = vals_np
elif words[0] == "(RAT":
pin_name = words[1]
if pin_name == "VGND" or pin_name == "VPER":
continue
numbers = words[-2] + words[-1]
pat = r'\d+\.\d+|\d+' # find all floating numbers
vals_str = re.findall(pat, numbers)
vals = []
for vs in vals_str:
vals.append(float(vs))
assert(len(vals) == 4)
# make it like the DAC22's paper
vals_np = np.zeros(4, dtype=np.double)
vals_np[0] = vals[0]
vals_np[1] = vals[2]
vals_np[2] = vals[1]
vals_np[3] = vals[3]
if not pin_name in pin_time:
pin_time[pin_name] = ArrivalTime()
# pin_time[pin_name].rat = np.array(vals, dtype=np.double)
pin_time[pin_name].rat = vals_np
print(f'invalid_cnt / tot_cnt: {invalid_cnt} / {tot_cnt}, {float(invalid_cnt / tot_cnt) * 100}%')
# deal with FFs
for li in range(num_lines):
line = lines[li]
# parse CELL field
words = line.split()
if words[0] == "(CELL":
cell_type = lines[li + 1].split()[-1][1:-2]
inst = lines[li + 2].split()[-1][:-1]
if len(lines[li + 2].split()) == 1:
inst = block_name
elif words[0] == "(TIMINGCHECK":
inst_time[inst].isFF = True
with open(os.path.join(save_dir, "inst_time.dict.pkl"), 'wb') as f:
pickle.dump(inst_time, f)
f.close()
with open(os.path.join(save_dir, "pin_time.dict.pkl"), 'wb') as f:
pickle.dump(pin_time, f)
f.close()
def load_sdf_dict(save_dir):
inst_time = None
pin_time = None
with open(os.path.join(save_dir, "inst_time.dict.pkl"), 'rb') as f:
inst_time = pickle.load(f)
f.close()
with open(os.path.join(save_dir, "pin_time.dict.pkl"), 'rb') as f:
pin_time = pickle.load(f)
f.close()
return inst_time, pin_time
def parse_libs(libs, save_dir):
libdata = dict()
pin_cap = dict()
for tag in libs:
liberty_files = libs[tag]
libdata[tag] = dict()
pin_cap[tag] = dict()
for liberty_file in liberty_files:
if liberty_file[-3:] == '.gz':
library = parse_liberty(gzip.open(liberty_file, 'rb').read().decode('utf-8'))
else:
library = parse_liberty(open(liberty_file).read())
# Loop through all cells.
for cell_group in library.get_groups('cell'):
cell_name = cell_group.args[0]
libdata[tag][cell_name] = dict()
pin_cap[tag][cell_name] = dict()
def parse_pin_group(pin_group):
if type(pin_group.args[0]) == str:
pin_name = pin_group.args[0]
else:
pin_name = pin_group.args[0].value
# Access a pin attribute.
rise_capacitance = pin_group['rise_capacitance']
fall_capacitance = pin_group['fall_capacitance']
if rise_capacitance == None:
rise_capacitance = 0.0
if fall_capacitance == None:
fall_capacitance = 0.0
pin_cap[tag][cell_name][pin_name] = dict()
pin_cap[tag][cell_name][pin_name]['rise_capacitance'] = rise_capacitance
pin_cap[tag][cell_name][pin_name]['fall_capacitance'] = fall_capacitance
timing = pin_group.get_groups('timing')
for tg in timing:
if type(tg['related_pin']) == str:
related_pin = tg['related_pin']
else:
related_pin = tg['related_pin'].value
# NOTE: for sky130hd PDK cell sky130_fd_sc_hd__ebufn_1,
# its pin "Z" has 2 timing lut related to pin "TE_B",
# with attribute "timing_type" as "three_state_disable"
# and "three_state_enable" respectively.
# with "three_state_enable", the rise/fall_transition is empty.
# with "three_state_disable", the rise/fall_transition is valid.
# Here, we just randomly choose one timing lut of this path.
# that is, if this path has been already met during parsing, just skip it.
cell_path_key = pin_name + "/" + related_pin
if cell_path_key in libdata[tag][cell_name]:
continue
def decode_lut(lut):
def decode_(key):
pat = r'\d+\.\d+|\d+' # find all floating numbers or integer numbers
data_str = ""
for ss in lut[key]:
data_str += ss.value
data_str += " "
val_strs = re.findall(pat, data_str)
vals = []
for val in val_strs:
vals.append(float(val))
return np.array(vals)
result = np.concatenate([
decode_('index_1'), decode_('index_2'), decode_('values')
])
return result
cell_rise = tg.get_groups('cell_rise')
cell_fall = tg.get_groups('cell_fall')
rise_transition = tg.get_groups('rise_transition')
fall_transition = tg.get_groups('fall_transition')
valid_cell_rise = True
valid_cell_fall = True
valid_rise_transition = True
valid_fall_transition = True
try:
cell_rise = decode_lut(cell_rise[0])
if cell_rise.size != 63:
cell_rise = np.zeros(63)
valid_cell_rise = False
except:
cell_rise = np.zeros(63)
valid_cell_rise = False
try:
cell_fall = decode_lut(cell_fall[0])
if cell_fall.size != 63:
cell_fall = np.zeros(63)
valid_cell_fall = False
except:
cell_fall = np.zeros(63)
valid_cell_fall = False
try:
rise_transition = decode_lut(rise_transition[0])
if rise_transition.size != 63:
rise_transition = np.zeros(63)
valid_rise_transition = False
except:
rise_transition = np.zeros(63)
valid_rise_transition = False
try:
fall_transition = decode_lut(fall_transition[0])
if fall_transition.size != 63:
fall_transition = np.zeros(63)
valid_fall_transition = False
except:
fall_transition = np.zeros(63)
valid_fall_transition = False
prefix = np.zeros(4*15)
suffix = np.zeros(4*49)
lut_valid = [valid_cell_rise, valid_cell_fall, valid_rise_transition, valid_fall_transition]
lut_data = [cell_rise, cell_fall, rise_transition, fall_transition]
for i in range(4):
prefix[i*15] = lut_valid[i]
prefix[i*15+1 : i*15+15] = lut_data[i][:14]
suffix[i*49 : i*49+49] = lut_data[i][14:63]
libdata[tag][cell_name][cell_path_key] = np.concatenate([prefix, suffix])
# Loop through all pins of the cell.
for pin_group in cell_group.get_groups('pin'):
parse_pin_group(pin_group)
for bundle_group in cell_group.get_groups('bundle'):
for pin_group in bundle_group.get_groups('pin'):
parse_pin_group(pin_group)
print(f'finish reading {liberty_file}')
# pickle and save libdata and pin_cap
with open(os.path.join(save_dir, "lib_data.pkl"), 'wb') as f:
pickle.dump(libdata, f)
f.close()
with open(os.path.join(save_dir, "pin_caps.pkl"), 'wb') as f:
pickle.dump(pin_cap, f)
f.close()
def load_libdata(save_dir):
with open(os.path.join(save_dir, "lib_data.pkl"), 'rb') as f:
libdata = pickle.load(f)
f.close()
with open(os.path.join(save_dir, "pin_caps.pkl"), 'rb') as f:
pincaps = pickle.load(f)
f.close()
return libdata, pincaps
def parse_inst2libcell_map(def_file, save_dir):
with open(def_file, 'r') as f:
lines = f.readlines()
f.close()
inst2libcell_map = dict()
for li in range(len(lines)):
line = lines[li]
words = line.split()
if len(words) == 0:
continue
if words[0] == 'COMPONENTS':
li += 1
while True:
line = lines[li]
li += 1
words = line.split()
if words[0] == 'END' and words[1] == 'COMPONENTS':
break
# valid_lines
inst = words[1]
libcell = words[2]
inst2libcell_map[inst] = libcell
break
with open(os.path.join(save_dir, 'inst2libcell_map.pkl'), 'wb') as f:
pickle.dump(inst2libcell_map, f)
f.close()
timing_arc_types = [
'clk2q', 'in2out', # cell arc
'inport2d', 'inport2clk', 'inport2in', # src = input port
'q2outport', 'out2outport', # dst = output port
'inport2outport', # feed-through
'q2in', 'out2in', 'out2d', 'q2d', # wire arc
]
timing_arc_types2id_map = dict()
tmp_cnt = 0
for arc_type in timing_arc_types:
timing_arc_types2id_map[arc_type] = tmp_cnt
tmp_cnt += 1
class TimingArc:
# src, dst: pin full name
def __init__(self, src, dst):
self.src = src
self.dst = dst
self.type = None
self.buffers = [] # an ordered sequence of buffer, src->dst, (buf_in, buf_out)
self.delays = None # delays from src->dst
class TimingGraph:
def __init__(self, inst2libcell_map):
self.inst2libcell_map = inst2libcell_map
self.all_arcs = []
self.arc_groups = dict()
self.init()
def init(self):
for arc_type in timing_arc_types:
self.arc_groups[arc_type] = []
def _get_arc_type(self, arc):
_src = arc.src.split('/')
_dst = arc.dst.split('/')
if len(_src) == 1 and len(_dst) == 1: # feed through
return 'inport2outport'
elif len(_src) == 1 and len(_dst) > 1: # from input port
dst_inst = _dst[0]
dst_libcell = self.inst2libcell_map[dst_inst]
if 'FF' in dst_libcell or 'LL' in dst_libcell: # LL: Latch
dst_pin_raw = _dst[1]
if 'D' in dst_pin_raw:
return 'inport2d'
else:
return 'inport2clk'
else:
return 'inport2in'
elif len(_src) > 1 and len(_dst) == 1: # to output port
src_inst = _src[0]
if src_inst == 'ethmac_1634.DREAMPlace.Shape0': # debug
pdb.set_trace()
src_libcell = self.inst2libcell_map[src_inst]
if 'FF' in src_libcell or 'LL' in src_libcell:
return 'q2outport'
else:
return 'out2outport'
else:
src_inst = _src[0]
dst_inst = _dst[0]
src_libcell = self.inst2libcell_map[src_inst]
dst_libcell = self.inst2libcell_map[dst_inst]
if src_inst == dst_inst:
if 'FF' in src_libcell or 'LL' in dst_libcell: # cell arc
return 'clk2q'
else:
return 'in2out'
else: # wire arc
if ('FF' in src_libcell and 'FF' in dst_libcell) or ('LL' in src_libcell and 'LL' in dst_libcell):
return 'q2d'
elif 'FF' in src_libcell or 'LL' in src_libcell:
return 'q2in'
elif 'FF' in dst_libcell or 'LL' in dst_libcell:
return 'out2d'
else:
return 'out2in'
def add_arc(self, arc):
self.all_arcs.append(arc)
# add arc into corresponding groups
arc_type = self._get_arc_type(arc)
arc.type = arc_type
self.arc_groups[arc_type].append(arc)
def get_arc_group(self, arc_type):
return self.arc_groups[arc_type]
def dfs(pin, target, place_pins, src_pin2path_map, first_call=False):
if pin == target:
return [], True
if not first_call and pin in place_pins:
# stop searching
return [], False
if not pin in src_pin2path_map:
return [], False
flag = False
pin_paths = src_pin2path_map[pin]
for pin_path in pin_paths:
chain, flag = dfs(pin_path.dst, target, place_pins, src_pin2path_map)
if flag:
chain.append(pin_path)
return chain, True
# if not flag
return [], False
import torch
import numpy as np
import dgl
import torch.nn.functional as F
import random
import pdb
import time
import argparse
import os
from sklearn.metrics import r2_score
# import tee
from model import PredModel
pdk = "asap7"
tag = "no_timing_opt"
dir_prefix = f"/cyberpi/OpenROAD-flow-scripts/flow/parse/{pdk}/{tag}"
# blocks = "aes aes-mbff ethmac gcd ibex jpeg mock-alu uart".split()
blocks = "aes aes-mbff gcd ibex jpeg uart".split()
# blocks_test = set(('aes', 'ibex'))
blocks_test = set()
blocks_train = set()
for block in blocks:
if not block in blocks_test:
blocks_train.add(block)
# train config
netdelay = True
celldelay = True
groundtruth = True
def gen_topo(g_hetero):
torch.cuda.synchronize()
time_s = time.time()
# na, nb = g_hetero.edges(etype='fanout2fanin', form='uv')
# ca, cb = g_hetero.edges(etype='in2out', form='uv')
# ffa, ffb = g_hetero.edges(etype='clk2q', form='uv')
# eda, edb = g_hetero.edges(etype='fanout2d', form='uv')
# g = dgl.graph((torch.cat([na, ca, ffa, eda]).cpu(), torch.cat([nb, cb, ffb, edb]).cpu()))
# na, nb = g_hetero.edges(etype='net_out', form='uv')
# ca, cb = g_hetero.edges(etype='cell_out', form='uv')
# g = dgl.graph((torch.cat([na, ca]).cpu(), torch.cat([nb, cb]).cpu()))
na, nb = g_hetero.edges(etype='fanout2fanin', form='uv')
ca, cb = g_hetero.edges(etype='in2out', form='uv')
pa, pb = g_hetero.edges(etype='_2outport', form='uv')
g = dgl.graph((torch.cat([na, ca, pa]).cpu(), torch.cat([nb, cb, pb]).cpu()))
topo = dgl.topological_nodes_generator(g) # this seems like topo-sort
ret = [t.cuda() for t in topo]
torch.cuda.synchronize()
time_e = time.time()
return ret, time_e - time_s
def load_data():
data = {}
for block in blocks:
graph_path = os.path.join(dir_prefix, block, "parsed", f"{block}.2.graph.bin")
g = dgl.load_graphs(graph_path)[0][0].to('cuda')
topo, topo_time = gen_topo(g)
ts = {
# 'fanin_nodes': g.edges(etype='fanout2fanin')[1].long(),
# 'fanout_nodes': g.edges(etype='fanout2fanin')[0].long(),
'input_nodes': (g.ndata['nf'][:, 1] < 0.5).nonzero().flatten().type(torch.int64),
'output_nodes': (g.ndata['nf'][:, 1] > 0.5).nonzero().flatten().type(torch.int64),
'topo': topo,
}
data[block] = g, ts
return data
def train(model, data_train):
optimizer = torch.optim.Adam(model.parameters(), lr=0.0005)
# debug: load graph one by one
for k, (g, ts) in data_train.items():
print(f'-------- {k} --------')
try:
pred_net_delays, pred_cell_delays, pred_atslew = model(g, ts)
except:
print('error')
pdb.set_trace()
# batch_size = 5
batch_size = 1
for e in range(100000):
model.train()
train_loss_tot_net_delays, train_loss_tot_cell_delays, train_loss_tot_ats = 0, 0, 0
for k, (g, ts) in random.sample(data_train.items(), batch_size):
pred_net_delays, pred_cell_delays, pred_atslew = model(g, ts)
pdb.set_trace()
if __name__ == "__main__":
data = load_data()
data_train = {k: t for k, t in data.items() if k in blocks_train}
data_test = {k: t for k, t in data.items() if k in blocks_test}
model = PredModel()
model.cuda()
train(model, data_train)
import torch
import torch.nn.functional as F
import dgl
import dgl.function as fn
import functools
import pdb
class MLP(torch.nn.Module):
def __init__(self, *sizes, batchnorm=False, dropout=False):
super().__init__()
fcs = []
for i in range(1, len(sizes)):
fcs.append(torch.nn.Linear(sizes[i - 1], sizes[i]))
if i < len(sizes) - 1:
fcs.append(torch.nn.LeakyReLU(negative_slope=0.2))
if dropout: fcs.append(torch.nn.Dropout(p=0.2))
if batchnorm: fcs.append(torch.nn.BatchNorm1d(sizes[i]))
self.layers = torch.nn.Sequential(*fcs)
def forward(self, x):
return self.layers(x)
class NetConv(torch.nn.Module):
def __init__(self, in_nf, in_ef, out_nf, h1=32, h2=32):
super().__init__()
self.in_nf = in_nf
self.in_ef = in_ef
self.out_nf = out_nf
self.h1 = h1
self.h2 = h2
self.MLP_msg_i2o = MLP(self.in_nf * 2 + self.in_ef, 64, 64, 64, 1 + self.h1 + self.h2)
self.MLP_reduce_o = MLP(self.in_nf + self.h1 + self.h2, 64, 64, 64, self.out_nf)
self.MLP_msg_o2i = MLP(self.in_nf * 2 + self.in_ef, 64, 64, 64, 64, self.out_nf)
def edge_msg_i(self, edges):
x = torch.cat([edges.src['nf'], edges.dst['nf'], edges.data['ef']], dim=1)
x = self.MLP_msg_o2i(x)
return {'efi': x}
def edge_msg_o(self, edges):
x = torch.cat([edges.src['nf'], edges.dst['nf'], edges.data['ef']], dim=1)
x = self.MLP_msg_i2o(x)
k, f1, f2 = torch.split(x, [1, self.h1, self.h2], dim=1)
k = torch.sigmoid(k)
return {'efo1': f1 * k, 'efo2': f2 * k}
def node_reduce_o(self, nodes):
x = torch.cat([nodes.data['nf'], nodes.data['nfo1'], nodes.data['nfo2']], dim=1)
x = self.MLP_reduce_o(x)
return {'new_nf': x}
def forward(self, g, ts, nf):
with g.local_scope():
g.ndata['nf'] = nf
# # fanin nodes
# g.update_all(self.edge_msg_i, fn.sum('efi', 'new_nf'), etype='fanout2fanin')
# # fanout nodes
# g.apply_edges(self.edge_msg_o, etype='fanin2fanout')
# g.update_all(fn.copy_e('efo1', 'efo1'), fn.sum('efo1', 'nfo1'), etype='fanin2fanout')
# g.update_all(fn.copy_e('efo2', 'efo2'), fn.max('efo2', 'nfo2'), etype='fanin2fanout')
# g.apply_nodes(self.node_reduce_o, ts['fanout_nodes'])
# input nodes
g.update_all(self.edge_msg_i, fn.sum('efi', 'new_nf'), etype='net_out')
# output nodes
g.apply_edges(self.edge_msg_o, etype='net_in')
g.update_all(fn.copy_e('efo1', 'efo1'), fn.sum('efo1', 'nfo1'), etype='net_in')
g.update_all(fn.copy_e('efo2', 'efo2'), fn.max('efo2', 'nfo2'), etype='net_in')
g.apply_nodes(self.node_reduce_o, ts['output_nodes'])
return g.ndata['new_nf']
class SignalProp(torch.nn.Module):
def __init__(self, in_nf, in_cell_num_luts, in_cell_lut_sz, out_nf, out_cef, h1=32, h2=32, lut_dup=4):
super().__init__()
self.in_nf = in_nf
self.in_cell_num_luts = in_cell_num_luts
self.in_cell_lut_sz = in_cell_lut_sz
self.out_nf = out_nf
self.out_cef = out_cef
self.h1 = h1
self.h2 = h2
self.lut_dup = lut_dup
self.MLP_netprop = MLP(self.out_nf + 2 * self.in_nf, 64, 64, 64, 64, self.out_nf)
self.MLP_lut_query = MLP(self.out_nf + 2 * self.in_nf, 64, 64, 64, self.in_cell_num_luts * lut_dup * 2)
self.MLP_lut_attention = MLP(1 + 2 + self.in_cell_lut_sz * 2, 64, 64, 64, self.in_cell_lut_sz * 2)
self.MLP_cellarc_msg = MLP(self.out_nf + 2 * self.in_nf + self.in_cell_num_luts * self.lut_dup, 64, 64, 64, 1 + self.h1 + self.h2 + self.out_cef)
self.MLP_cellreduce = MLP(self.in_nf + self.h1 + self.h2, 64, 64, 64, self.out_nf)
def edge_msg_net(self, edges, groundtruth=False):
if groundtruth:
last_nf = edges.src['n_atslew']
else:
last_nf = edges.src['new_nf']
x = torch.cat([last_nf, edges.src['nf'], edges.dst['nf']], dim=1)
x = self.MLP_netprop(x)
return {'efn': x}
def edge_msg_cell(self, edges, groundtruth=False):
# generate lut axis query
if groundtruth:
last_nf = edges.src['n_atslew']
else:
last_nf = edges.src['new_nf']
q = torch.cat([last_nf, edges.src['nf'], edges.dst['nf']], dim=1)
q = self.MLP_lut_query(q)
q = q.reshape(-1, 2)
# answer lut axis query
axis_len = self.in_cell_num_luts * (1 + 2 * self.in_cell_lut_sz)
axis = edges.data['ef'][:, :axis_len]
axis = axis.reshape(-1, 1 + 2 * self.in_cell_lut_sz)
axis = axis.repeat(1, self.lut_dup).reshape(-1, 1 + 2 * self.in_cell_lut_sz)
a = self.MLP_lut_attention(torch.cat([q, axis], dim=1))
# transform answer to answer mask matrix
a = a.reshape(-1, 2, self.in_cell_lut_sz)
ax, ay = torch.split(a, [1, 1], dim=1)
a = torch.matmul(ax.reshape(-1, self.in_cell_lut_sz, 1), ay.reshape(-1, 1, self.in_cell_lut_sz)) # batch tensor product
# look up answer matrix in lut
tables_len = self.in_cell_num_luts * self.in_cell_lut_sz ** 2
tables = edges.data['ef'][:, axis_len:axis_len + tables_len]
r = torch.matmul(tables.reshape(-1, 1, 1, self.in_cell_lut_sz ** 2), a.reshape(-1, 4, self.in_cell_lut_sz ** 2, 1)) # batch dot product
# construct final msg
r = r.reshape(len(edges), self.in_cell_num_luts * self.lut_dup)
x = torch.cat([last_nf, edges.src['nf'], edges.dst['nf'], r], dim=1)
x = self.MLP_cellarc_msg(x)
k, f1, f2, cef = torch.split(x, [1, self.h1, self.h2, self.out_cef], dim=1)
k = torch.sigmoid(k)
return {'efc1': f1 * k, 'efc2': f2 * k, 'efce': cef}
def node_reduce_o(self, nodes):
x = torch.cat([nodes.data['nf'], nodes.data['nfc1'], nodes.data['nfc2']], dim=1)
x = self.MLP_cellreduce(x)
return {'new_nf': x}
def node_skip_level_o(self, nodes):
return {'new_nf': nodes.data['n_atslew']}
def forward(self, g, ts, nf):
assert len(ts['topo']) % 2 == 0, 'The number of logic levels must be even (net, cell, net)'
with g.local_scope():
# init level 0 with ground truth features
g.ndata['nf'] = nf
g.ndata['new_nf'] = torch.zeros(g.num_nodes(), self.out_nf, device='cuda', dtype=nf.dtype)
# no primary io port considered here
# g.apply_nodes(self.node_skip_level_o, ts['pi_nodes'])
def prop_net(nodes, groundtruth):
g.pull(nodes, functools.partial(self.edge_msg_net, groundtruth=groundtruth), fn.sum('efn', 'new_nf'), etype='fanout2fanin')
def prop_cell(nodes, groundtruth):
# cell_edges = ['in2out', 'clk2q', 'fanout2d']
# for etype in cell_edges:
# es = g.in_edges(nodes, etype=etype)
# g.apply_edges(functools.partial(self.edge_msg_cell, groundtruth=groundtruth), es, etype=etype)
# g.send_and_recv(es, fn.copy_e('efc1', 'efc1'), fn.sum('efc1', 'nfc1'), etype=etype)
# g.send_and_recv(es, fn.copy_e('efc2', 'efc2'), fn.max('efc2', 'nfc2'), etype=etype)
etype = 'cell_out'
es = g.in_edges(nodes, etype=etype)
g.apply_edges(functools.partial(self.edge_msg_cell, groundtruth=groundtruth), es, etype=etype)
g.send_and_recv(es, fn.copy_e('efc1', 'efc1'), fn.sum('efc1', 'nfc1'), etype=etype)
g.send_and_recv(es, fn.copy_e('efc2', 'efc2'), fn.max('efc2', 'nfc2'), etype=etype)
g.apply_nodes(self.node_reduce_o, nodes)
groundtruth = False # What does it mean???
if groundtruth:
# don't need to propagate.
prop_net(ts['input_nodes'], groundtruth)
prop_cell(ts['output_nodes_nonpi'], groundtruth)
else:
# propagate
for i in range(1, len(ts['topo'])):
if i % 2 == 1:
prop_net(ts['topo'][i], groundtruth)
else:
prop_cell(ts['topo'][i], groundtruth)
return g.ndata['new_nf'], g.edges['cell_out'].data['efce']
class PredModel(torch.nn.Module):
def __init__(self):
super().__init__()
self.nc1 = NetConv(10, 2, 32)
self.nc2 = NetConv(32, 2, 32)
self.nc3 = NetConv(32, 2, 16) # 16 = 4x delay + 12x arbitrary (might include cap, beta)
self.prop = SignalProp(10 + 16, 8, 7, 8, 4)
def forward(self, g, ts):
nf0 = g.ndata['nf']
x = self.nc1(g, ts, nf0)
x = self.nc2(g, ts, x)
x = self.nc3(g, ts, x)
net_delays = x[:, :4]
nf1 = torch.cat([nf0, x], dim=1)
nf2, cell_delays = self.prop(g, ts, nf1)
return net_delays, cell_delays, nf2
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment