+ mt_req = ((kwargs['chains'] * kwargs['nodeness']) + kwargs['mtcr'] - 1)\
+ / kwargs['mtcr']
+ dt_req = ((kwargs['chains'] * kwargs['nodeness']) + kwargs['dtcr'] - 1)\
+ / kwargs['dtcr']
+
+ cpu_req = kwargs['skip_cnt'] + mt_req + dt_req
+ if smt_used and cpu_req > cpu_list_len / CpuUtils.NR_OF_THREADS:
+ raise RuntimeError("Not enough CPU cores available for placement!")
+ elif not smt_used and cpu_req > cpu_list_len:
+ raise RuntimeError("Not enough CPU cores available for placement!")
+
+ offset = (kwargs['node_id'] - 1) + (kwargs['chain_id'] - 1)\
+ * kwargs['nodeness']
+ dtc = kwargs['dtc']
+ try:
+ mt_odd = (offset / mt_req) & 1
+ mt_skip = kwargs['skip_cnt'] + (offset % mt_req)
+ dt_skip = kwargs['skip_cnt'] + mt_req + (offset % dt_req) * dtc
+ except ZeroDivisionError:
+ raise RuntimeError("Invalid placement combination!")
+
+ if smt_used:
+ cpu_list_0 = cpu_list[:cpu_list_len / CpuUtils.NR_OF_THREADS]
+ cpu_list_1 = cpu_list[cpu_list_len / CpuUtils.NR_OF_THREADS:]
+
+ mt_cpu_list = [cpu for cpu in cpu_list_1[mt_skip:mt_skip + 1]] \
+ if mt_odd else [cpu for cpu in cpu_list_0[mt_skip:mt_skip + 1]]
+
+ dt_cpu_list = [cpu for cpu in cpu_list_0[dt_skip:dt_skip + dtc]]
+ dt_cpu_list += [cpu for cpu in cpu_list_1[dt_skip:dt_skip + dtc]]
+ else:
+ mt_cpu_list = [cpu for cpu in cpu_list[mt_skip:mt_skip + 1]]
+ dt_cpu_list = [cpu for cpu in cpu_list[dt_skip:dt_skip + dtc]]