diff options
author | Rajarshi Das <drajarshi@in.ibm.com> | 2018-01-27 23:16:36 -0600 |
---|---|---|
committer | Rajarshi Das <drajarshi@in.ibm.com> | 2018-01-27 23:16:36 -0600 |
commit | 51d40c7a7fe86249516353391e778d6be28a62f9 (patch) | |
tree | b9df2fcec1c9c4296d082647624c7ce83a72dccd /catalog | |
parent | 01b26a136da16a87c0b6b3c4d9f27555dca104dc (diff) | |
download | ima-catalog-51d40c7a7fe86249516353391e778d6be28a62f9.tar.gz ima-catalog-51d40c7a7fe86249516353391e778d6be28a62f9.zip |
Fix indents in generate_dts.py
Signed-off-by: Rajarshi Das <drajarshi@in.ibm.com>
Diffstat (limited to 'catalog')
-rw-r--r-- | catalog/generate_dts.py | 2410 |
1 files changed, 1205 insertions, 1205 deletions
diff --git a/catalog/generate_dts.py b/catalog/generate_dts.py index 59c1618..8fd52be 100644 --- a/catalog/generate_dts.py +++ b/catalog/generate_dts.py @@ -16,38 +16,38 @@ from struct import * from collections import namedtuple import os -event_domain_1 = [] #Chip IMA events -event_domain_2 = [] #Core IMA event (PDBAR) -event_domain_2_a = [] #Thread IMA event (LDBAR) -event_domain_3 = [] #per-thread PMU events -event_domain_4 = [] #OCC Sensors evenst -group_chip = [] #Chip IMA Group +event_domain_1 = [] #Chip IMA events +event_domain_2 = [] #Core IMA event (PDBAR) +event_domain_2_a = [] #Thread IMA event (LDBAR) +event_domain_3 = [] #per-thread PMU events +event_domain_4 = [] #OCC Sensors evenst +group_chip = [] #Chip IMA Group nest_units_P8 = { - "MCS":0, - "PowerBus":1, - "Pumps_and":1, - "X-link":2, - "A-link":3, - "PHB":4, - "Unknown":5 + "MCS":0, + "PowerBus":1, + "Pumps_and":1, + "X-link":2, + "A-link":3, + "PHB":4, + "Unknown":5 } # XLINK0 is also part of XLINK_OUT. # To add XLINK_IN back, reset the mapping from XLINK_IN: 3, in sequence # e.g. xlink_out: 4, .... capp: 7, ntl and ats: 8, nx: 9 nest_units_P9 = { - "PowerBus":0, - "MCS":1, - "MBA":2, -# "XLINK_IN":3, # Need a separate common node for *IN and *OUT - "XLINK_OUT":3, - "MCD":4, - "PHB":5, # Group name starts with PCIE. Map this to group phb below - "CAPP":6, - "NTL":7, # NVLink + "PowerBus":0, + "MCS":1, + "MBA":2, +# "XLINK_IN":3, # Need a separate common node for *IN and *OUT + "XLINK_OUT":3, + "MCD":4, + "PHB":5, # Group name starts with PCIE. Map this to group phb below + "CAPP":6, + "NTL":7, # NVLink "ATS":7, # NVLink - "NX":8 + "NX":8 } nvlink_P9 = { @@ -71,11 +71,11 @@ nest_unit_indices_P8 = [0, 0, 0, 0, 0] nest_unit_prefixes_P8 = ["NODEF", "PM_PB_", "NODEF", "NODEF", "NODEF"] -# The following commented section corresponds to 'xlink_in' that existed previously. +# The following commented section corresponds to 'xlink_in' that existed previously. #nest_unit_names_P9 = ["powerbus", "mcs", "mba", "xlink_in", "xlink_out", "mcd", "phb", "capp", "ntl", "nx"] # ntl => nvlink #nest_unit_indices_P9 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] #nest_unit_prefixes_P9 = ["PM_PB_", "NODEF", "NODEF", "NODEF", "NODEF", "NODEF", "NODEF"\ -# , "NODEF", "NODEF", "PM_NX_"] # "NODEF" implies it is constructed at runtime +# , "NODEF", "NODEF", "PM_NX_"] # "NODEF" implies it is constructed at runtime #nest_unit_scale_P9 = ["256", "256", "1", "4096", "4096", "256", "1", "256", "256", "256"] # Per unit prescale #nest_unit_names_supported_P9 = ["mcs", "powerbus", "xlink", "phb"] # Modify this based on actual support #nest_unit_names_supported_P9 = ["mcs", "powerbus", "xlink_in", "xlink_out", "phb", "mba", "mcd", "capp", "ntl", "nx"] # Modify this based on actual support @@ -86,7 +86,7 @@ nest_unit_names_P9 = ["powerbus", "mcs", "mba", "xlink_out", "mcd", "phb", "capp nest_unit_indices_P9 = [0, 0, 0, 0, 0, 0, 0, 0, 0] nest_unit_prefixes_P9 = ["PM_PB_", "NODEF", "NODEF", "NODEF", "NODEF", "NODEF"\ - , "NODEF", "NODEF", "PM_NX_"] # "NODEF" implies it is constructed at runtime + , "NODEF", "NODEF", "PM_NX_"] # "NODEF" implies it is constructed at runtime nest_unit_scale_P9 = ["256", "256", "1", "4096", "256", "1", "256", "256", "256"] # Per unit prescale @@ -134,8 +134,8 @@ type_thread_P9 = 0x1; pvrvalue = "" #< P9 below -nest_offset = 0x320000; -nest_size = 0x80000; +nest_offset = 0x320000; +nest_size = 0x80000; type_chip = 0x10; type_core = 0x4; type_thread = 0x1; @@ -145,7 +145,7 @@ core_thread_size = 0x2000; # PVR lists p8_pvr_list = ["4D0200", "4D0100", "4D0000"] # The reduced list was originally intended to print only 'mcs' nodes -# . But to align with the pull request from Mar 13 '17, +# . But to align with the pull request from Mar 13 '17, # printing only 'mcs' nodes for 4D0100 as well. p8_reduced_pvr_list = ["4D0200", "4D0100"] p9_pvr_list = ["4E0100", "4E0200"] # 4E implies P9. 01=> DD1, 02=> DD2 @@ -156,357 +156,357 @@ up_xfer_event = 0 # Filter out the raw (non-ascii) byes def get_name(st): - res = set(string.printable) - return filter(lambda x: x in res, st) + res = set(string.printable) + return filter(lambda x: x in res, st) class Page0: - def __init__(self, data): - self.page0_format = "I I Q 16s 32s H H H\ - 2s H H H 2s H H H 2s H H H 2s I I I\ - I I I 8s" - self.page0_str = 'desc len ver build res1 sd_off sd_len sd_cnt\ - res2 ed_off ed_len ed_cnt res3 gd_off\ - gd_len gd_cnt res4 fr_off fr_len fr_cnt\ - res5 coree_off th_off che_off coreg_off\ - thg_off chg_off res6' - self.page0_arr = namedtuple('page0_arr', self.page0_str) - self.page0 = self.page0_arr._make(unpack("> "+self.page0_format, - data)) - - def get_events_start(self): - return (self.page0.ed_off * 4096) - - def get_events_count(self): - return (self.page0.ed_cnt) - - def get_group_start(self): - return (self.page0.gd_off * 4096) - - def get_group_count(self): - return (self.page0.gd_cnt) - - def get_pvr_and_version(self): - return (self.page0.ver) + def __init__(self, data): + self.page0_format = "I I Q 16s 32s H H H\ + 2s H H H 2s H H H 2s H H H 2s I I I\ + I I I 8s" + self.page0_str = 'desc len ver build res1 sd_off sd_len sd_cnt\ + res2 ed_off ed_len ed_cnt res3 gd_off\ + gd_len gd_cnt res4 fr_off fr_len fr_cnt\ + res5 coree_off th_off che_off coreg_off\ + thg_off chg_off res6' + self.page0_arr = namedtuple('page0_arr', self.page0_str) + self.page0 = self.page0_arr._make(unpack("> "+self.page0_format, + data)) + + def get_events_start(self): + return (self.page0.ed_off * 4096) + + def get_events_count(self): + return (self.page0.ed_cnt) + + def get_group_start(self): + return (self.page0.gd_off * 4096) + + def get_group_count(self): + return (self.page0.gd_cnt) + + def get_pvr_and_version(self): + return (self.page0.ver) class Event: - def __init__(self, fn, offset): - self.offset = offset - self.event_hformat = 'H H B s H H H I H H H' - self.event_str = 'len fr domain res1 st_off ev_len ev_off flag\ - pr_idx grp_cnt ev_name_len' - self.event_arr = namedtuple('event_arr', self.event_str) - fn.seek(0) - fn.seek(self.offset) - self._event = self.event_arr._make(unpack("> "+self.event_hformat, - fn.read(calcsize(self.event_hformat)))) - self._ev_offset = self._event.st_off + self._event.ev_off - self._ev_name_r = fn.read(self._event.ev_name_len - 2) - self._ev_name = get_name(self._ev_name_r) - self._ev_desc_ft = 'H' - self._ev_desc_str = 'len' - self._ev_desc = namedtuple('_ev_desc', self._ev_desc_str) - self._ev_des = self._ev_desc._make(unpack("> "+self._ev_desc_ft, - fn.read(calcsize(self._ev_desc_ft)))) - self._ev_description = fn.read(self._ev_des.len-2) - self._ev_description = get_name(self._ev_description) - self._ev_des_d = self._ev_desc._make(unpack("> "+self._ev_desc_ft, - fn.read(calcsize(self._ev_desc_ft)))) - self._ev_de_desc = fn.read(self._ev_des_d.len) - ev_list = [self._ev_name, self._ev_offset, self._ev_description] - if (self._event.domain == 1): - event_domain_1.append(ev_list) - elif (self._event.domain == 2): - event_domain_2.append(ev_list) - event_domain_2_a.append(ev_list) - elif (self._event.domain == 3): - event_domain_3.append(ev_list) - else: - print "Unknown Domain" + def __init__(self, fn, offset): + self.offset = offset + self.event_hformat = 'H H B s H H H I H H H' + self.event_str = 'len fr domain res1 st_off ev_len ev_off flag\ + pr_idx grp_cnt ev_name_len' + self.event_arr = namedtuple('event_arr', self.event_str) + fn.seek(0) + fn.seek(self.offset) + self._event = self.event_arr._make(unpack("> "+self.event_hformat, + fn.read(calcsize(self.event_hformat)))) + self._ev_offset = self._event.st_off + self._event.ev_off + self._ev_name_r = fn.read(self._event.ev_name_len - 2) + self._ev_name = get_name(self._ev_name_r) + self._ev_desc_ft = 'H' + self._ev_desc_str = 'len' + self._ev_desc = namedtuple('_ev_desc', self._ev_desc_str) + self._ev_des = self._ev_desc._make(unpack("> "+self._ev_desc_ft, + fn.read(calcsize(self._ev_desc_ft)))) + self._ev_description = fn.read(self._ev_des.len-2) + self._ev_description = get_name(self._ev_description) + self._ev_des_d = self._ev_desc._make(unpack("> "+self._ev_desc_ft, + fn.read(calcsize(self._ev_desc_ft)))) + self._ev_de_desc = fn.read(self._ev_des_d.len) + ev_list = [self._ev_name, self._ev_offset, self._ev_description] + if (self._event.domain == 1): + event_domain_1.append(ev_list) + elif (self._event.domain == 2): + event_domain_2.append(ev_list) + event_domain_2_a.append(ev_list) + elif (self._event.domain == 3): + event_domain_3.append(ev_list) + else: + print "Unknown Domain" class Events: - def __init__(self, fn, offset, cnt): - self.offset = offset - self.cnt = cnt - self.event_hformat = 'H' - self.event_str = 'len' - self.event_arr = namedtuple('event_arr', self.event_str) - for i in range(0, cnt): - fn.seek(0) - fn.seek(self.offset) - self._event = self.event_arr._make(unpack("> "+self.event_hformat, - fn.read(calcsize(self.event_hformat)))) - Event(fn, self.offset) - self.offset += self._event.len - - print('length of event_domain_1: {}'.format(len(event_domain_1))) - for i in range(0,len(event_domain_1)): - print('event_domain_1: {}'.format(event_domain_1[i])) + def __init__(self, fn, offset, cnt): + self.offset = offset + self.cnt = cnt + self.event_hformat = 'H' + self.event_str = 'len' + self.event_arr = namedtuple('event_arr', self.event_str) + for i in range(0, cnt): + fn.seek(0) + fn.seek(self.offset) + self._event = self.event_arr._make(unpack("> "+self.event_hformat, + fn.read(calcsize(self.event_hformat)))) + Event(fn, self.offset) + self.offset += self._event.len + + print('length of event_domain_1: {}'.format(len(event_domain_1))) + for i in range(0,len(event_domain_1)): + print('event_domain_1: {}'.format(event_domain_1[i])) class Group: - def __init__(self, fn, offset, nest_units): - self.offset = offset - self.grp_hformat = 'H 2s I B s H H B B HHHHHHHHHHHHHHHH H' - self.grp_str = 'len res1 flag domain res2 sta_off gr_len sc_idx\ - ev_cnt ev_idx0 ev_idx1 ev_idx2 ev_idx3\ - ev_idx4 ev_idx5 ev_idx6 ev_idx7 ev_idx8\ - ev_idx9 ev_idx10 ev_idx11 ev_idx12\ - ev_idx13 ev_idx14 ev_idx15 name_len' - self.grp_arr = namedtuple('grp_arr', self.grp_str) - fn.seek(0) - fn.seek(self.offset) - self._group = self.grp_arr._make(unpack("> "+self.grp_hformat, - fn.read(calcsize(self.grp_hformat)))) - self._grp_name_r = fn.read(self._group.name_len - 2) - self._grp_name = self._grp_name_r.strip("0") - self.dt_index = -1 - for key, value in nest_units.items(): - if self._grp_name.startswith(key): - print 'matched group: {} with key: {}'.format(self._grp_name, key) -# if (key=='ATS'): This check is not required since the units_supported only includes 'NTL' + def __init__(self, fn, offset, nest_units): + self.offset = offset + self.grp_hformat = 'H 2s I B s H H B B HHHHHHHHHHHHHHHH H' + self.grp_str = 'len res1 flag domain res2 sta_off gr_len sc_idx\ + ev_cnt ev_idx0 ev_idx1 ev_idx2 ev_idx3\ + ev_idx4 ev_idx5 ev_idx6 ev_idx7 ev_idx8\ + ev_idx9 ev_idx10 ev_idx11 ev_idx12\ + ev_idx13 ev_idx14 ev_idx15 name_len' + self.grp_arr = namedtuple('grp_arr', self.grp_str) + fn.seek(0) + fn.seek(self.offset) + self._group = self.grp_arr._make(unpack("> "+self.grp_hformat, + fn.read(calcsize(self.grp_hformat)))) + self._grp_name_r = fn.read(self._group.name_len - 2) + self._grp_name = self._grp_name_r.strip("0") + self.dt_index = -1 + for key, value in nest_units.items(): + if self._grp_name.startswith(key): + print 'matched group: {} with key: {}'.format(self._grp_name, key) +# if (key=='ATS'): This check is not required since the units_supported only includes 'NTL' # self.dt_index = nest_units['NTL'] # If we match ATS, include the events in the 'NTL' group # else: - self.dt_index = value - break - if not (pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list): - print('check. group name: {}'.format(self._grp_name)) -# Since XLINK0 is also part of XLINK_OUT, XLINK_IN is not required. -# Uncomment the lines if we need to separately add XLINK0 group specific events into XLINK_IN + self.dt_index = value + break + if not (pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list): + print('check. group name: {}'.format(self._grp_name)) +# Since XLINK0 is also part of XLINK_OUT, XLINK_IN is not required. +# Uncomment the lines if we need to separately add XLINK0 group specific events into XLINK_IN # if 'XLINK0' in self._grp_name: # print('group name is {}'.format(self._grp_name)) # self.dt_index = nest_units['XLINK_IN'] # break # elif ('XLINK1' in self._grp_name) or ('XLINK2' in self._grp_name): - if ('XLINK0' in self._grp_name) or ('XLINK1' in self._grp_name) \ - or ('XLINK2' in self._grp_name): - print('group name is {}'.format(self._grp_name)) - self.dt_index = nest_units['XLINK_OUT'] - break - if ( self.dt_index == -1): - return - - arr = [] - arr.append(self._group.ev_idx0) - arr.append(self._group.ev_idx1) - arr.append(self._group.ev_idx2) - arr.append(self._group.ev_idx3) - arr.append(self._group.ev_idx4) - arr.append(self._group.ev_idx5) - arr.append(self._group.ev_idx6) - arr.append(self._group.ev_idx7) - arr.append(self._group.ev_idx8) - arr.append(self._group.ev_idx9) - arr.append(self._group.ev_idx10) - arr.append(self._group.ev_idx11) - arr.append(self._group.ev_idx12) - arr.append(self._group.ev_idx13) - arr.append(self._group.ev_idx14) - arr.append(self._group.ev_idx15) - - print 'arr: {}'.format(arr) - - for i in range(0, self._group.ev_cnt): - group_chip[self.dt_index].append(arr[i]) - print 'group_chip[{}]: {}'.format(self.dt_index, group_chip[self.dt_index]) + if ('XLINK0' in self._grp_name) or ('XLINK1' in self._grp_name) \ + or ('XLINK2' in self._grp_name): + print('group name is {}'.format(self._grp_name)) + self.dt_index = nest_units['XLINK_OUT'] + break + if ( self.dt_index == -1): + return + + arr = [] + arr.append(self._group.ev_idx0) + arr.append(self._group.ev_idx1) + arr.append(self._group.ev_idx2) + arr.append(self._group.ev_idx3) + arr.append(self._group.ev_idx4) + arr.append(self._group.ev_idx5) + arr.append(self._group.ev_idx6) + arr.append(self._group.ev_idx7) + arr.append(self._group.ev_idx8) + arr.append(self._group.ev_idx9) + arr.append(self._group.ev_idx10) + arr.append(self._group.ev_idx11) + arr.append(self._group.ev_idx12) + arr.append(self._group.ev_idx13) + arr.append(self._group.ev_idx14) + arr.append(self._group.ev_idx15) + + print 'arr: {}'.format(arr) + + for i in range(0, self._group.ev_cnt): + group_chip[self.dt_index].append(arr[i]) + print 'group_chip[{}]: {}'.format(self.dt_index, group_chip[self.dt_index]) class Groups: - def __init__(self, fn, offset, cnt, nest_units): - self.offset = offset - self.cnt = cnt - self.group_len = 'H' - self.group_str = 'len' - self.group_arr = namedtuple('group_arr', self.group_str) - for i in range(0, len(nest_units)): - group_chip.append([]) - - print 'group count: {}'.format(cnt) - for i in range(0, cnt): - fn.seek(0) - fn.seek(self.offset) - self._group = self.group_arr._make(unpack("> "+self.group_len, - fn.read(calcsize(self.group_len)))) - Group(fn, self.offset, nest_units) - self.offset += self._group.len + def __init__(self, fn, offset, cnt, nest_units): + self.offset = offset + self.cnt = cnt + self.group_len = 'H' + self.group_str = 'len' + self.group_arr = namedtuple('group_arr', self.group_str) + for i in range(0, len(nest_units)): + group_chip.append([]) + + print 'group count: {}'.format(cnt) + for i in range(0, cnt): + fn.seek(0) + fn.seek(self.offset) + self._group = self.group_arr._make(unpack("> "+self.group_len, + fn.read(calcsize(self.group_len)))) + Group(fn, self.offset, nest_units) + self.offset += self._group.len def dt_event(tabs, name, reg, size, unit, scale, desc, nodename): # Simplified node name - s = "" - s += '\t' * tabs +'%s@%x {\n'% (nodename, reg) - s += '\t' * (tabs+1) + 'event-name = "%s" ;\n' % (name) - s += '\t' * (tabs+1) + 'reg = <0x%x 0x%x>;\n'%(reg,size) - if unit != '' and unit != 'N/A' and unit.strip() : - s += '\t' * (tabs+1) + 'unit = "%s" ;\n'%(unit) - if scale != '' and scale != 'N/A' and scale.strip() : - s += '\t' * (tabs+1) + 'scale = "%s" ;\n'%(scale) - if desc != '' : # Add desc only if available - s += '\t' * (tabs + 1) + 'desc = "%s" ;\n' % (desc) - s += '\t' * tabs + '};' - return s + s = "" + s += '\t' * tabs +'%s@%x {\n'% (nodename, reg) + s += '\t' * (tabs+1) + 'event-name = "%s" ;\n' % (name) + s += '\t' * (tabs+1) + 'reg = <0x%x 0x%x>;\n'%(reg,size) + if unit != '' and unit != 'N/A' and unit.strip() : + s += '\t' * (tabs+1) + 'unit = "%s" ;\n'%(unit) + if scale != '' and scale != 'N/A' and scale.strip() : + s += '\t' * (tabs+1) + 'scale = "%s" ;\n'%(scale) + if desc != '' : # Add desc only if available + s += '\t' * (tabs + 1) + 'desc = "%s" ;\n' % (desc) + s += '\t' * tabs + '};' + return s # 'unit' and 'scale' not covered in dt_event2(). Also, the name and offset change. def dt_event2(tabs, name, reg, size, unit, scale, desc, nodename, \ - event_prefix): # Simplified node name - global pvrvalue - global p8_pvr_list, p8_reduced_pvr_list, p9_pvr_list - - unit_type = '' - unit_name_ = '' - unit_name = '' - - name_split2 = '' - name_split = '' - - global up_xfer_event, down_xfer_event - - s = "" - -# Start the node always on P9 - if not (pvrvalue in p8_pvr_list or pvrvalue in p8_reduced_pvr_list): - s += '\t' * tabs + '%s@%x {\n'% (nodename, reg) - - pm_prefix = "PM_" - # For repeatable groups / events - - if (event_prefix != ''): - print 'event_prefix: {}'.format(event_prefix); - print 'name: {}'.format(name); - -# Split the first time only. - name_split = name.split(event_prefix,1); - print 'name_split: {}'.format(name_split); - - if pvrvalue in p8_pvr_list or pvrvalue in p8_reduced_pvr_list: - print 'pvrvalue: {}'.format(pvrvalue) - print 'p8_pvr_list: {}'.format(p8_pvr_list) - print 'p8_reduced_pvr_list: {}'.format(p8_reduced_pvr_list) - print 'down_xfer_event: {}'.format(down_xfer_event) - print 'up_xfer_event: {}'.format(up_xfer_event) - - if ("_MC" in name_split[1]): # DOWN_128B_DATA_XFER_MC0 - name_split2 = name_split[1].split("_MC",1) # 'DOWN_128B_DATA_XFER','' - # update the event nodes just once - print 'name_split2[0]: {}\n'.format(name_split2[0]) - if (((name_split2[0]=="DOWN_128B_DATA_XFER") and down_xfer_event == 0) or\ - ((name_split2[0]=="UP_128B_DATA_XFER") and up_xfer_event == 0)): - print 'in..\n' -# Start the node for P8 case within the if condition - s += '\t' * tabs + '%s@%x {\n'% (nodename, reg) - - s += '\t' * (tabs+1) + 'event-name = "%s" ;\n'\ - % (name_split2[0]) # DOWN_128B_DATA_XFER - - if (name_split2[0]=="DOWN_128B_DATA_XFER"): - down_xfer_event = 1 - if (name_split2[0]=="UP_128B_DATA_XFER"): - up_xfer_event = 1 - s += '\t' * (tabs+1) + 'unit = "%s" ;\n' % (nest_mcs_unit) - s += '\t' * (tabs+1) + 'scale = "%s" ;\n' % (nest_mcs_scale) - else: - s += '\t' * (tabs+1) + 'event-name = "%s" ;\n'\ - % (name_split[1]) - - if (event_prefix != 'CPM_'): # Not core / thread - unit_name_ = event_prefix.split(pm_prefix); # e.g. {,MCS0_} - unit_name = unit_name_[1].split('_'); # e.g. {MCS0,} - - if pvrvalue in p8_pvr_list or pvrvalue in p8_reduced_pvr_list: - unit_type = unit_name; # type and name are both MCS - else: - unit_type = unit_name[0].rstrip('0123456789'); # {MCS} - print 'unit_name: {}, unit_type: {}'.format(unit_name, unit_type); - else: # P9, NVLink: event_prefix='' - s += '\t' * (tabs+1) + 'event-name = "%s" ;\n' %name - - print 'printing reg: {}, size: {}'.format(reg,size) - - # If we are P8, and we updated the event-name, unit and scale, then - # update the offset and size - if pvrvalue in p8_pvr_list or pvrvalue in p8_reduced_pvr_list: - if ((up_xfer_event == 1) or (down_xfer_event == 1)): - s += '\t' * (tabs+1) + 'reg = <0x%x 0x%x>;\n'%(reg,size) - else: - s += '\t' * (tabs+1) + 'reg = <0x%x 0x%x>;\n'%(reg,size) - - print 'in hex: s: {}'.format(s) - - if desc != '' : # Add desc only if available - if pvrvalue in p8_pvr_list or pvrvalue in p8_reduced_pvr_list: - # Update the description only if the event isn't updated already - print 'down_xfer_event: {}'.format(down_xfer_event) - print 'up_xfer_event: {}'.format(up_xfer_event) - - if ((down_xfer_event == 1) or (up_xfer_event == 1)): - if (down_xfer_event == 1): - desc = "Total Write Bandwidth seen on both MCS"; - down_xfer_event = 2 - if (up_xfer_event == 1): - desc = "Total Read Bandwidth seen on both MCS"; - up_xfer_event = 2 - s += '\t' * (tabs + 1) + 'desc = "%s" ;\n' % (desc) - - s += '\t' * tabs + '};' # end the node within the if condition - s += '\n' - else: - if (unit_type != ''): # repeatable unit. Remove the unit index - print 'at repeatable unit. replacing {} with {}'.format(unit_name[0],unit_type); - print 'desc before replacement: {}'.format(desc); - desc_r = desc.replace(unit_name[0], unit_type); # replace MCS0 with MCS in the description to make it generic - desc = desc_r; - print 'desc after replacement: {}'.format(desc); - s += '\t' * (tabs + 1) + 'desc = "%s" ;\n' % (desc) - -# End the node always on P9 - if not (pvrvalue in p8_pvr_list or pvrvalue in p8_reduced_pvr_list): - s += '\t' * tabs + '};' - s += '\n' - - return s - -# Group the NVlink events + event_prefix): # Simplified node name + global pvrvalue + global p8_pvr_list, p8_reduced_pvr_list, p9_pvr_list + + unit_type = '' + unit_name_ = '' + unit_name = '' + + name_split2 = '' + name_split = '' + + global up_xfer_event, down_xfer_event + + s = "" + +# Start the node always on P9 + if not (pvrvalue in p8_pvr_list or pvrvalue in p8_reduced_pvr_list): + s += '\t' * tabs + '%s@%x {\n'% (nodename, reg) + + pm_prefix = "PM_" + # For repeatable groups / events + + if (event_prefix != ''): + print 'event_prefix: {}'.format(event_prefix); + print 'name: {}'.format(name); + +# Split the first time only. + name_split = name.split(event_prefix,1); + print 'name_split: {}'.format(name_split); + + if pvrvalue in p8_pvr_list or pvrvalue in p8_reduced_pvr_list: + print 'pvrvalue: {}'.format(pvrvalue) + print 'p8_pvr_list: {}'.format(p8_pvr_list) + print 'p8_reduced_pvr_list: {}'.format(p8_reduced_pvr_list) + print 'down_xfer_event: {}'.format(down_xfer_event) + print 'up_xfer_event: {}'.format(up_xfer_event) + + if ("_MC" in name_split[1]): # DOWN_128B_DATA_XFER_MC0 + name_split2 = name_split[1].split("_MC",1) # 'DOWN_128B_DATA_XFER','' + # update the event nodes just once + print 'name_split2[0]: {}\n'.format(name_split2[0]) + if (((name_split2[0]=="DOWN_128B_DATA_XFER") and down_xfer_event == 0) or\ + ((name_split2[0]=="UP_128B_DATA_XFER") and up_xfer_event == 0)): + print 'in..\n' +# Start the node for P8 case within the if condition + s += '\t' * tabs + '%s@%x {\n'% (nodename, reg) + + s += '\t' * (tabs+1) + 'event-name = "%s" ;\n'\ + % (name_split2[0]) # DOWN_128B_DATA_XFER + + if (name_split2[0]=="DOWN_128B_DATA_XFER"): + down_xfer_event = 1 + if (name_split2[0]=="UP_128B_DATA_XFER"): + up_xfer_event = 1 + s += '\t' * (tabs+1) + 'unit = "%s" ;\n' % (nest_mcs_unit) + s += '\t' * (tabs+1) + 'scale = "%s" ;\n' % (nest_mcs_scale) + else: + s += '\t' * (tabs+1) + 'event-name = "%s" ;\n'\ + % (name_split[1]) + + if (event_prefix != 'CPM_'): # Not core / thread + unit_name_ = event_prefix.split(pm_prefix); # e.g. {,MCS0_} + unit_name = unit_name_[1].split('_'); # e.g. {MCS0,} + + if pvrvalue in p8_pvr_list or pvrvalue in p8_reduced_pvr_list: + unit_type = unit_name; # type and name are both MCS + else: + unit_type = unit_name[0].rstrip('0123456789'); # {MCS} + print 'unit_name: {}, unit_type: {}'.format(unit_name, unit_type); + else: # P9, NVLink: event_prefix='' + s += '\t' * (tabs+1) + 'event-name = "%s" ;\n' %name + + print 'printing reg: {}, size: {}'.format(reg,size) + + # If we are P8, and we updated the event-name, unit and scale, then + # update the offset and size + if pvrvalue in p8_pvr_list or pvrvalue in p8_reduced_pvr_list: + if ((up_xfer_event == 1) or (down_xfer_event == 1)): + s += '\t' * (tabs+1) + 'reg = <0x%x 0x%x>;\n'%(reg,size) + else: + s += '\t' * (tabs+1) + 'reg = <0x%x 0x%x>;\n'%(reg,size) + + print 'in hex: s: {}'.format(s) + + if desc != '' : # Add desc only if available + if pvrvalue in p8_pvr_list or pvrvalue in p8_reduced_pvr_list: + # Update the description only if the event isn't updated already + print 'down_xfer_event: {}'.format(down_xfer_event) + print 'up_xfer_event: {}'.format(up_xfer_event) + + if ((down_xfer_event == 1) or (up_xfer_event == 1)): + if (down_xfer_event == 1): + desc = "Total Write Bandwidth seen on both MCS"; + down_xfer_event = 2 + if (up_xfer_event == 1): + desc = "Total Read Bandwidth seen on both MCS"; + up_xfer_event = 2 + s += '\t' * (tabs + 1) + 'desc = "%s" ;\n' % (desc) + + s += '\t' * tabs + '};' # end the node within the if condition + s += '\n' + else: + if (unit_type != ''): # repeatable unit. Remove the unit index + print 'at repeatable unit. replacing {} with {}'.format(unit_name[0],unit_type); + print 'desc before replacement: {}'.format(desc); + desc_r = desc.replace(unit_name[0], unit_type); # replace MCS0 with MCS in the description to make it generic + desc = desc_r; + print 'desc after replacement: {}'.format(desc); + s += '\t' * (tabs + 1) + 'desc = "%s" ;\n' % (desc) + +# End the node always on P9 + if not (pvrvalue in p8_pvr_list or pvrvalue in p8_reduced_pvr_list): + s += '\t' * tabs + '};' + s += '\n' + + return s + +# Group the NVlink events def dt_group_nvlink_events_P9(events): - nvlink_groups_P9 = {} + nvlink_groups_P9 = {} - for key,value in nvlink_P9.items(): - newkey = 'nvlink' + key # nvlink0 - eventlist = [] - for i in range(0,len(events)): # PM_NTL0* - for j in range(0,len(value)): # NTL0 - if (value[j] in event_domain_1[events[i]][0]): - eventlist.append(events[i]) - break - nvlink_groups_P9[newkey] = eventlist + for key,value in nvlink_P9.items(): + newkey = 'nvlink' + key # nvlink0 + eventlist = [] + for i in range(0,len(events)): # PM_NTL0* + for j in range(0,len(value)): # NTL0 + if (value[j] in event_domain_1[events[i]][0]): + eventlist.append(events[i]) + break + nvlink_groups_P9[newkey] = eventlist - print('nvlink_groups_P9: {}'.format(nvlink_groups_P9)) - return nvlink_groups_P9 + print('nvlink_groups_P9: {}'.format(nvlink_groups_P9)) + return nvlink_groups_P9 def dt_unit2(tabs, unit, events, compat, unit_names, unit_indices, unit_count, unit_prefixes): # In case there are multiple nodes of one type - i = 0 - t = "" - print 'unit: {} count: {}'.format(unit_names[unit], unit_count) + i = 0 + t = "" + print 'unit: {} count: {}'.format(unit_names[unit], unit_count) - if (unit > -1) and not (pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list): - while TOD_index in events: + if (unit > -1) and not (pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list): + while TOD_index in events: events.remove(TOD_index) # Remove the TOD event entry if P9/NEST - for k,v in P9_NEST_skip_list.items(): # Remove the entries in the P9/NEST skip list + for k,v in P9_NEST_skip_list.items(): # Remove the entries in the P9/NEST skip list if unit_names[unit] == k: - print('events before applying skip list: {}'.format(events)) - for i in range(0,len(v)): - for j in range(0,len(event_domain_1)): + print('events before applying skip list: {}'.format(events)) + for i in range(0,len(v)): + for j in range(0,len(event_domain_1)): # print(event_domain_1[j][0]) - if (event_domain_1[j][0] == v[i]): - events.remove(j) - break - print('events after applying skip list: {}'.format(events)) - + if (event_domain_1[j][0] == v[i]): + events.remove(j) + break + print('events after applying skip list: {}'.format(events)) + # First print the common node for the unit: includes all the common events - [unit_common_string, event_prefix, unit_prefix] = dt_unit_common(tabs, unit, events, compat, \ - unit_names, unit_indices, unit_count, unit_prefixes); + [unit_common_string, event_prefix, unit_prefix] = dt_unit_common(tabs, unit, events, compat, \ + unit_names, unit_indices, unit_count, unit_prefixes); - t += unit_common_string; + t += unit_common_string; # For NVlink (P9), need to have a dummy unit node/ super node, hence commented section below. # If a unit node/ super node is not required, uncomment the following 4 lines. @@ -515,574 +515,574 @@ def dt_unit2(tabs, unit, events, compat, unit_names, unit_indices, unit_count, u # if (unit_names[unit]) == 'ntl': # return t # Do not prepare the supernodes since nvlink requires common nodes only - if not (pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list): # P9 - if (unit_names[unit]) == 'ntl': - unit_count = 1 # One unit node/super node is created per common event node for nvlink - - # then print the data per iteration (of the unit) - print 'unit: {} count: {}'.format(unit_names[unit], unit_count) - - if unit_count > 1: # need to split the unit's data uniformly - event_prefix_all = event_prefix - if unit_prefixes[unit] == "NODEF": - if pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list: - events_per_iteration = len(events) / unit_count - else: # P9 - if unit_names[unit] != "ntl": + if not (pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list): # P9 + if (unit_names[unit]) == 'ntl': + unit_count = 1 # One unit node/super node is created per common event node for nvlink + + # then print the data per iteration (of the unit) + print 'unit: {} count: {}'.format(unit_names[unit], unit_count) + + if unit_count > 1: # need to split the unit's data uniformly + event_prefix_all = event_prefix + if unit_prefixes[unit] == "NODEF": + if pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list: + events_per_iteration = len(events) / unit_count + else: # P9 + if unit_names[unit] != "ntl": events_per_iteration = len(events) / unit_count # mcs, mba, capp, nx, xlink, phb - else: + else: events_per_iteration = len(events) # ntl - print 'events_per_iteration: {}'.format(events_per_iteration) - print('unit: {}, unit_count: {}'.format(unit_names[unit], unit_count)) - i = 0 - while i < unit_count: - print('iteration count: {}'.format(i)) - events_single = events[i*events_per_iteration:(i*events_per_iteration)+events_per_iteration] # split the events per iteration within the unit - print 'events_single: {}'.format(events_single) - if not (pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list): - if (unit_names[unit] == 'xlink_in') or\ - (unit_names[unit] == 'xlink_out'): # Xlink - event_prefix_xlink = event_prefix_all - event_prefix = event_prefix_xlink[i] - elif unit_names[unit] == 'mcs': - event_prefix_mcs = event_prefix_all - event_prefix = event_prefix_mcs[i] - elif unit_names[unit] == 'capp': - event_prefix_capp = event_prefix_all - event_prefix = event_prefix_capp[i] - elif unit_names[unit] == 'ntl': - event_prefix = i # pass just the index - # for MBA, and PHB the event_prefix is generated inside dt_unit_single2() - - print('event_prefix: {}'.format(event_prefix)) - t += dt_unit_single2(tabs, unit, events_single, compat, unit_names, unit_indices, unit_prefix, unit_count, unit_prefixes, event_prefix); - unit_indices[unit] = unit_indices[unit] + 1 - i = i + 1 - else: # only one unit of this type. P9: NX, PB - if unit_names[unit] == 'xlink_in': # Since the same array is used for both xlink_in (single unit) and xlink_out (2 units) - event_prefix_all = event_prefix # array - event_prefix = event_prefix_all[0] - t += dt_unit_single2(tabs, unit, events, compat, unit_names, unit_indices, unit_prefix, unit_count, unit_prefixes, event_prefix) - unit_indices[unit] = unit_indices[unit] + 1 - - return t + print 'events_per_iteration: {}'.format(events_per_iteration) + print('unit: {}, unit_count: {}'.format(unit_names[unit], unit_count)) + i = 0 + while i < unit_count: + print('iteration count: {}'.format(i)) + events_single = events[i*events_per_iteration:(i*events_per_iteration)+events_per_iteration] # split the events per iteration within the unit + print 'events_single: {}'.format(events_single) + if not (pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list): + if (unit_names[unit] == 'xlink_in') or\ + (unit_names[unit] == 'xlink_out'): # Xlink + event_prefix_xlink = event_prefix_all + event_prefix = event_prefix_xlink[i] + elif unit_names[unit] == 'mcs': + event_prefix_mcs = event_prefix_all + event_prefix = event_prefix_mcs[i] + elif unit_names[unit] == 'capp': + event_prefix_capp = event_prefix_all + event_prefix = event_prefix_capp[i] + elif unit_names[unit] == 'ntl': + event_prefix = i # pass just the index + # for MBA, and PHB the event_prefix is generated inside dt_unit_single2() + + print('event_prefix: {}'.format(event_prefix)) + t += dt_unit_single2(tabs, unit, events_single, compat, unit_names, unit_indices, unit_prefix, unit_count, unit_prefixes, event_prefix); + unit_indices[unit] = unit_indices[unit] + 1 + i = i + 1 + else: # only one unit of this type. P9: NX, PB + if unit_names[unit] == 'xlink_in': # Since the same array is used for both xlink_in (single unit) and xlink_out (2 units) + event_prefix_all = event_prefix # array + event_prefix = event_prefix_all[0] + t += dt_unit_single2(tabs, unit, events, compat, unit_names, unit_indices, unit_prefix, unit_count, unit_prefixes, event_prefix) + unit_indices[unit] = unit_indices[unit] + 1 + + return t def dt_unit(tabs, unit, events, compat, nest_unit_names, nest_unit_indices, nest_unit_count, nest_unit_prefixes): # In case there are multiple nodes of one type - i = 0 - t = "" - print 'unit: {} count: {}'.format(nest_unit_names[unit], nest_unit_count) - - # First print the common data for the unit - [unit_common_string, event_prefix, unit_prefix] = dt_unit_common(tabs, unit, events, compat, \ - nest_unit_names, nest_unit_indices, nest_unit_count, nest_unit_prefixes); - - t += unit_common_string; - - unit_prefix = nest_unit_names[unit].upper(); - unit_prefix = "NEST_" + unit_prefix; - -# if nest_unit_names[unit] == "mcs": # 4 mcs nodes - if nest_unit_count > 1: # need to split the unit's data uniformly - events_per_iteration =len(events) / nest_unit_count - print 'events_per_iteration: {}'.format(events_per_iteration) # debug - - while i < nest_unit_count: -# Assuming dt_unit() runs only for a P8 PVR - if nest_unit_names[unit] == 'mcs': - events_single = [events[i]] # Offsets for all 4 mcs units are available in the 1st 4 events itself. 'List'ify the single event - else: - events_single = events[i*events_per_iteration:(i*events_per_iteration)+events_per_iteration] # split the events per iteration within the unit - print 'unit: {}'.format(unit) # debug - t += dt_unit_single(tabs, unit, events_single, compat, nest_unit_names, unit_prefix, nest_unit_indices, nest_unit_prefixes) # added unit_prefix - nest_unit_indices[unit] = nest_unit_indices[unit] + 1 - i = i + 1 - else: - t += dt_unit_single(tabs, unit, events, compat, nest_unit_names, unit_prefix, nest_unit_indices, nest_unit_prefixes) - nest_unit_indices[unit] = nest_unit_indices[unit] + 1 - - return t + i = 0 + t = "" + print 'unit: {} count: {}'.format(nest_unit_names[unit], nest_unit_count) + + # First print the common data for the unit + [unit_common_string, event_prefix, unit_prefix] = dt_unit_common(tabs, unit, events, compat, \ + nest_unit_names, nest_unit_indices, nest_unit_count, nest_unit_prefixes); + + t += unit_common_string; + + unit_prefix = nest_unit_names[unit].upper(); + unit_prefix = "NEST_" + unit_prefix; + +# if nest_unit_names[unit] == "mcs": # 4 mcs nodes + if nest_unit_count > 1: # need to split the unit's data uniformly + events_per_iteration =len(events) / nest_unit_count + print 'events_per_iteration: {}'.format(events_per_iteration) # debug + + while i < nest_unit_count: +# Assuming dt_unit() runs only for a P8 PVR + if nest_unit_names[unit] == 'mcs': + events_single = [events[i]] # Offsets for all 4 mcs units are available in the 1st 4 events itself. 'List'ify the single event + else: + events_single = events[i*events_per_iteration:(i*events_per_iteration)+events_per_iteration] # split the events per iteration within the unit + print 'unit: {}'.format(unit) # debug + t += dt_unit_single(tabs, unit, events_single, compat, nest_unit_names, unit_prefix, nest_unit_indices, nest_unit_prefixes) # added unit_prefix + nest_unit_indices[unit] = nest_unit_indices[unit] + 1 + i = i + 1 + else: + t += dt_unit_single(tabs, unit, events, compat, nest_unit_names, unit_prefix, nest_unit_indices, nest_unit_prefixes) + nest_unit_indices[unit] = nest_unit_indices[unit] + 1 + + return t # get the upper and lower (common node) prefixes as well as the event prefix # An ordered group of NVLink events gets passed in, mapping each of the nvlink units. # Therefore, only the corresponding upper and lower prefixes need to be prepared. def dt_unit_get_prefix_P9_NVlink(events): - prefix_upper='' - prefix_lower='' - nv_index_done = [] + prefix_upper='' + prefix_lower='' + nv_index_done = [] - for i in range(0, len(events)): - if 'NTL' in event_domain_1[events[i]][0]: - nvlink_index = event_domain_1[events[i]][0].strip('PM_').split('_')[0].strip('NTL') - if (nvlink_index in nv_index_done): - continue - prefix_upper = 'NVLINK' + nvlink_index - prefix_lower = 'nvlink' + nvlink_index - nv_index_done.append(nvlink_index) + for i in range(0, len(events)): + if 'NTL' in event_domain_1[events[i]][0]: + nvlink_index = event_domain_1[events[i]][0].strip('PM_').split('_')[0].strip('NTL') + if (nvlink_index in nv_index_done): + continue + prefix_upper = 'NVLINK' + nvlink_index + prefix_lower = 'nvlink' + nvlink_index + nv_index_done.append(nvlink_index) - return (prefix_upper, prefix_lower) + return (prefix_upper, prefix_lower) def dt_unit_get_prefix_P9_xlink(events): - prefix_upper = '' - prefix_lower = '' - event_prefix = '' - xlink0 = False # No xlink0 event processed yet - xlink1 = False - xlink2 = False - event_prefix_xl = [] - - print('in dt_unit_get_prefix_P9_xlink: events: '%(events)) - for i in range(0, len(events)): - event = event_domain_1[events[i]][0] - if 'XLINK1' in event or \ - 'XLINK2' in event or\ - 'XLINK0' in event: - if 'XLINK1' in event and xlink1 == False or\ - 'XLINK2' in event and xlink2 == False or\ - 'XLINK0' in event and xlink0 == False: - prefix_upper = 'XLINK_OUT' - prefix_lower = 'xlink-out' - if 'XLINK1' in event: - event_prefix = 'PM_XLINK1_' - event_prefix_xl.append(event_prefix) - xlink1 = True - if 'XLINK2' in event: - event_prefix = 'PM_XLINK2_' - event_prefix_xl.append(event_prefix) - xlink2 = True - if 'XLINK0' in event: - event_prefix = 'PM_XLINK0_' - event_prefix_xl.append(event_prefix) - xlink0 = True -# If XLINK0 becomes part of XLINK_IN, uncomment -# the lines below, and remove the XLINK0 if cases (2) above -# as well as the event_prefix setting for XLINK0 above. - -# elif 'XLINK0' in event and xlink0 == False: -# prefix_upper = 'XLINK_IN' -# prefix_lower = 'xlink-in' + prefix_upper = '' + prefix_lower = '' + event_prefix = '' + xlink0 = False # No xlink0 event processed yet + xlink1 = False + xlink2 = False + event_prefix_xl = [] + + print('in dt_unit_get_prefix_P9_xlink: events: '%(events)) + for i in range(0, len(events)): + event = event_domain_1[events[i]][0] + if 'XLINK1' in event or \ + 'XLINK2' in event or\ + 'XLINK0' in event: + if 'XLINK1' in event and xlink1 == False or\ + 'XLINK2' in event and xlink2 == False or\ + 'XLINK0' in event and xlink0 == False: + prefix_upper = 'XLINK_OUT' + prefix_lower = 'xlink-out' + if 'XLINK1' in event: + event_prefix = 'PM_XLINK1_' + event_prefix_xl.append(event_prefix) + xlink1 = True + if 'XLINK2' in event: + event_prefix = 'PM_XLINK2_' + event_prefix_xl.append(event_prefix) + xlink2 = True + if 'XLINK0' in event: + event_prefix = 'PM_XLINK0_' + event_prefix_xl.append(event_prefix) + xlink0 = True +# If XLINK0 becomes part of XLINK_IN, uncomment +# the lines below, and remove the XLINK0 if cases (2) above +# as well as the event_prefix setting for XLINK0 above. + +# elif 'XLINK0' in event and xlink0 == False: +# prefix_upper = 'XLINK_IN' +# prefix_lower = 'xlink-in' # event_prefix = 'PM_XLINK0_' # event_prefix_xl.append(event_prefix) # xlink0 = True - return (prefix_upper, prefix_lower, event_prefix_xl) + return (prefix_upper, prefix_lower, event_prefix_xl) # print the node with the common set of events for the unit # If P9 and NVLink, then this routine is called once for each nvlink unit def dt_unit_common(tabs, unit, events, compat, nest_unit_names, nest_unit_indices, nest_unit_count, nest_unit_prefixes): - global pvrvalue - global p8_pvr_list, p8_reduced_pvr_list, p9_pvr_list - - if (unit <= -1): # For core and thread - prefix = "CORE_THREAD"; - prefix2 = "core-thread-events"; - else: - if pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list: - prefix = nest_unit_names[unit].upper() - prefix = "NEST_" + prefix; - - prefix2= "nest-" + nest_unit_names[unit] + "-events"; - else: #P9 - if (nest_unit_names[unit] == 'ntl'): # NVLink - (prefix_upper_nv, prefix_lower_nv) = dt_unit_get_prefix_P9_NVlink(events) - prefix = "NEST_" + prefix_upper_nv - prefix2 = "nest-" + prefix_lower_nv + "-events" - elif (nest_unit_names[unit] == 'xlink_out' or\ - nest_unit_names[unit] == 'xlink_in'): # Xlink - (prefix_upper_xl, prefix_lower_xl, event_prefix_xl) = \ - dt_unit_get_prefix_P9_xlink(events) - prefix = "NEST_" + prefix_upper_xl - prefix2 = "nest-" + prefix_lower_xl + "-events" - else: # all other units - prefix = nest_unit_names[unit].upper() - prefix = "NEST_" + prefix; - - prefix2= "nest-" + nest_unit_names[unit] + "-events"; - - unit_prefix = prefix # Return this so it can be reused. E.g. NEST_XLINK_OUT - + global pvrvalue + global p8_pvr_list, p8_reduced_pvr_list, p9_pvr_list + + if (unit <= -1): # For core and thread + prefix = "CORE_THREAD"; + prefix2 = "core-thread-events"; + else: + if pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list: + prefix = nest_unit_names[unit].upper() + prefix = "NEST_" + prefix; + + prefix2= "nest-" + nest_unit_names[unit] + "-events"; + else: #P9 + if (nest_unit_names[unit] == 'ntl'): # NVLink + (prefix_upper_nv, prefix_lower_nv) = dt_unit_get_prefix_P9_NVlink(events) + prefix = "NEST_" + prefix_upper_nv + prefix2 = "nest-" + prefix_lower_nv + "-events" + elif (nest_unit_names[unit] == 'xlink_out' or\ + nest_unit_names[unit] == 'xlink_in'): # Xlink + (prefix_upper_xl, prefix_lower_xl, event_prefix_xl) = \ + dt_unit_get_prefix_P9_xlink(events) + prefix = "NEST_" + prefix_upper_xl + prefix2 = "nest-" + prefix_lower_xl + "-events" + else: # all other units + prefix = nest_unit_names[unit].upper() + prefix = "NEST_" + prefix; + + prefix2= "nest-" + nest_unit_names[unit] + "-events"; + + unit_prefix = prefix # Return this so it can be reused. E.g. NEST_XLINK_OUT + # prefix and prefix2 above are for the common node # e.g. prefix: NEST_XLINK_IN, prefix2: nest-xlink-in-events - s = "" - s += '\t' * tabs +'%s: %s {\n'% (prefix, prefix2) - tabs += 1 - tabs += 1 - s += '\t' * tabs + "#address-cells = <0x1>;\n" - s += '\t' * tabs + "#size-cells = <0x1>;\n\n" - - event_processed_count = 0 - event_prefix = ""; - # Need a prefix assigned for all units, regardless of whether they are repeatable - # or otherwise - if unit <= -1: # core / thread - event_prefix = "CPM_"; - - else: -# Fix event prefix directly if it is specified, else construct. - print('unit: {}'.format(unit)) - if nest_unit_prefixes[unit] == "NODEF": - if pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list: - events_per_iteration = len(events) / nest_unit_count - else: # P9 - if nest_unit_names[unit] != "ntl": + s = "" + s += '\t' * tabs +'%s: %s {\n'% (prefix, prefix2) + tabs += 1 + tabs += 1 + s += '\t' * tabs + "#address-cells = <0x1>;\n" + s += '\t' * tabs + "#size-cells = <0x1>;\n\n" + + event_processed_count = 0 + event_prefix = ""; + # Need a prefix assigned for all units, regardless of whether they are repeatable + # or otherwise + if unit <= -1: # core / thread + event_prefix = "CPM_"; + + else: +# Fix event prefix directly if it is specified, else construct. + print('unit: {}'.format(unit)) + if nest_unit_prefixes[unit] == "NODEF": + if pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list: + events_per_iteration = len(events) / nest_unit_count + else: # P9 + if nest_unit_names[unit] != "ntl": events_per_iteration = len(events) / nest_unit_count # mcs, mba, capp, nx, xlink print('unit: {}, event count: {}, events_per_iteration: {}'.format(nest_unit_names[unit], len(events), events_per_iteration)) - else: + else: events_per_iteration = len(events) # ntl. Complete list of grouped events to be consumed - # Prepare prefix using the nest unit name since no prefix exists. - # In P8, the event reads as PM_MCS_..UP/DOWN_128B_DATA_XFER_MC0/1/2/3 - # But the DTS needs to read them as PM_MCS0/1/2/3_UP/DOWN_128B_DATA_XFER - if pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list: - event_prefix = "PM_" + nest_unit_names[unit].upper() +\ - "_"; - else: - print('nest_unit: {}'.format(nest_unit_names[unit])) - if nest_unit_names[unit] != 'xlink_in' and\ - nest_unit_names[unit] != 'xlink_out' and\ - nest_unit_names[unit] != 'ntl': # prefixes identified - if nest_unit_names[unit] == 'mcs': - event_prefix_mcs = ['PM_MCS01_', 'PM_MCS23_'] - elif nest_unit_names[unit] == 'capp': - event_prefix_capp = ['PM_CAPP1_', 'PM_CAPP2_'] - else: # MBA, PHB - event_prefix = "PM_" + nest_unit_names[unit].upper() +\ - str(nest_unit_indices[unit]) + "_"; - else: # For P9: NX, PowerBus - events_per_iteration = len(events) - event_prefix = nest_unit_prefixes[unit] - - print 'unit: {} events: {}'.format(unit, events) - -# For core / thread, must find the starting (lowest) offset first since -# the event list is not in ascending offset order. Same for P9/NEST -# However, find the starting offset only from one unit's events if the + # Prepare prefix using the nest unit name since no prefix exists. + # In P8, the event reads as PM_MCS_..UP/DOWN_128B_DATA_XFER_MC0/1/2/3 + # But the DTS needs to read them as PM_MCS0/1/2/3_UP/DOWN_128B_DATA_XFER + if pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list: + event_prefix = "PM_" + nest_unit_names[unit].upper() +\ + "_"; + else: + print('nest_unit: {}'.format(nest_unit_names[unit])) + if nest_unit_names[unit] != 'xlink_in' and\ + nest_unit_names[unit] != 'xlink_out' and\ + nest_unit_names[unit] != 'ntl': # prefixes identified + if nest_unit_names[unit] == 'mcs': + event_prefix_mcs = ['PM_MCS01_', 'PM_MCS23_'] + elif nest_unit_names[unit] == 'capp': + event_prefix_capp = ['PM_CAPP1_', 'PM_CAPP2_'] + else: # MBA, PHB + event_prefix = "PM_" + nest_unit_names[unit].upper() +\ + str(nest_unit_indices[unit]) + "_"; + else: # For P9: NX, PowerBus + events_per_iteration = len(events) + event_prefix = nest_unit_prefixes[unit] + + print 'unit: {} events: {}'.format(unit, events) + +# For core / thread, must find the starting (lowest) offset first since +# the event list is not in ascending offset order. Same for P9/NEST +# However, find the starting offset only from one unit's events if the # unit name covers multiple units (e.g. mcs) - if (unit <= -1) or\ - not (pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list): - imastartoffset = 0 - for i in events: - if (unit <= -1): - event = i - else: - event = event_domain_1[i] - - if event_processed_count == 0: - imastartoffset = event[1] - - # for P9/NEST break if we processed events from 1 iteration - if ((unit > -1) and (event_processed_count == events_per_iteration)): - break; - - if event[1] < imastartoffset: - imastartoffset = event[1] - event_processed_count = event_processed_count + 1 - - - event_processed_count = 0 - -# Run the main loop (for core / thread/ NEST) - for i in events: - print('main loop. i: {}'.format(i)) - if (unit <= -1): # core / thread - event = i - else: - event = event_domain_1[i] - print('main loop. event: {}'.format(event)) - - print 'event: [0]: {}, [1]: {}, [2]: {}'.format(event[0],event[1],event[2]) - if event[0] == 'PM_XLINK_CYCLES' and xlink_cyc_event_added == True: - continue - if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE' and \ - xlink_cyc_last_sample_event_added == True: - continue - if event[0] == 'PM_ALINK_CYCLES' and alink_cyc_event_added == True: - continue - if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE' and \ - alink_cyc_last_sample_event_added == True: - continue - -# Set the ima start offset only for NEST if P8 - if (unit > -1) and \ - (pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list): - if event_processed_count == 0: - imastartoffset = event[1]; - print 'imastartoffset: {}'.format(imastartoffset) + if (unit <= -1) or\ + not (pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list): + imastartoffset = 0 + for i in events: + if (unit <= -1): + event = i + else: + event = event_domain_1[i] - if nest_unit_names[unit] == 'ntl': # nvlink - offset = event[1] - else: - offset = event[1] - imastartoffset; - print 'event: {} offset: {}'.format(event[0],offset) - - nodename = "event" - if nest_unit_names[unit] == 'mcs': # Setting event unit and scale to 'N/A' - # for unit 'MCS' as it is covered already - event_unit = 'N/A' - event_scale = 'N/A' - else: - event_unit = '' - event_scale = '' - - if (event[0] != 'RESERVED'): - if pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list: -# skip _LAST_SAMPLE events in P8 catalog - if ((unit > -1) and ("_LAST_SAMPLE" in event[0])): - continue; - else: # P9 - if nest_unit_names[unit] == 'mcs': - for i in range(0,len(event_prefix_mcs)): - if (event_prefix_mcs[i] in event[0]): - event_prefix = event_prefix_mcs[i] - break - elif nest_unit_names[unit] == 'xlink_in' or\ - nest_unit_names[unit] == 'xlink_out': - for i in range(0,len(event_prefix_xl)): - if (event_prefix_xl[i] in event[0]): - event_prefix = event_prefix_xl[i] - break - elif nest_unit_names[unit] == 'capp': - for i in range(0,len(event_prefix_capp)): - if (event_prefix_capp[i] in event[0]): - event_prefix = event_prefix_capp[i] - break - elif nest_unit_names[unit] == 'ntl': # nvlink - event_prefix = '' # no event_prefix for nvlink events - - print 'calling dt_event2 on event: {}'.format(event[0]); - s += dt_event2((tabs), event[0], offset, 8, event_unit,\ - event_scale, event[2], nodename, event_prefix) - - if event[0] == 'PM_XLINK_CYCLES': - xlink_cyc_event_added = True - if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE': - xlink_cyc_last_sample_event_added = True - if event[0] == 'PM_ALINK_CYCLES': - alink_cyc_event_added = True - if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE': - alink_cyc_last_sample_event_added = True - - event_processed_count = event_processed_count + 1; - -# For P8, process at least 3 sets of events so that we get to the UP_ -# and the DOWN_ events - if pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list: - if ((unit > -1) and (event_processed_count ==\ - events_per_iteration*3)): - break; - else: -# for NEST units, process as many events as there are for 1 iteration -# Applies to P9 only. - if ((unit > -1) and (event_processed_count == events_per_iteration)): - break; - s += '\t' * (tabs-1) + "};\n" + if event_processed_count == 0: + imastartoffset = event[1] - if not (pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list): - if nest_unit_names[unit] == 'mcs': - event_prefix = event_prefix_mcs - elif nest_unit_names[unit] == 'xlink_in' or\ - nest_unit_names[unit] == 'xlink_out': - event_prefix = event_prefix_xl - elif nest_unit_names[unit] == 'capp': - event_prefix = event_prefix_capp - elif nest_unit_names[unit] == 'ntl': # nvlink - event_prefix = '' # no event_prefix for nvlink events - - return [s, event_prefix, unit_prefix]; + # for P9/NEST break if we processed events from 1 iteration + if ((unit > -1) and (event_processed_count == events_per_iteration)): + break; + + if event[1] < imastartoffset: + imastartoffset = event[1] + event_processed_count = event_processed_count + 1 + + + event_processed_count = 0 + +# Run the main loop (for core / thread/ NEST) + for i in events: + print('main loop. i: {}'.format(i)) + if (unit <= -1): # core / thread + event = i + else: + event = event_domain_1[i] + print('main loop. event: {}'.format(event)) + + print 'event: [0]: {}, [1]: {}, [2]: {}'.format(event[0],event[1],event[2]) + if event[0] == 'PM_XLINK_CYCLES' and xlink_cyc_event_added == True: + continue + if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE' and \ + xlink_cyc_last_sample_event_added == True: + continue + if event[0] == 'PM_ALINK_CYCLES' and alink_cyc_event_added == True: + continue + if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE' and \ + alink_cyc_last_sample_event_added == True: + continue + +# Set the ima start offset only for NEST if P8 + if (unit > -1) and \ + (pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list): + if event_processed_count == 0: + imastartoffset = event[1]; + print 'imastartoffset: {}'.format(imastartoffset) + + if nest_unit_names[unit] == 'ntl': # nvlink + offset = event[1] + else: + offset = event[1] - imastartoffset; + print 'event: {} offset: {}'.format(event[0],offset) + + nodename = "event" + if nest_unit_names[unit] == 'mcs': # Setting event unit and scale to 'N/A' + # for unit 'MCS' as it is covered already + event_unit = 'N/A' + event_scale = 'N/A' + else: + event_unit = '' + event_scale = '' + + if (event[0] != 'RESERVED'): + if pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list: +# skip _LAST_SAMPLE events in P8 catalog + if ((unit > -1) and ("_LAST_SAMPLE" in event[0])): + continue; + else: # P9 + if nest_unit_names[unit] == 'mcs': + for i in range(0,len(event_prefix_mcs)): + if (event_prefix_mcs[i] in event[0]): + event_prefix = event_prefix_mcs[i] + break + elif nest_unit_names[unit] == 'xlink_in' or\ + nest_unit_names[unit] == 'xlink_out': + for i in range(0,len(event_prefix_xl)): + if (event_prefix_xl[i] in event[0]): + event_prefix = event_prefix_xl[i] + break + elif nest_unit_names[unit] == 'capp': + for i in range(0,len(event_prefix_capp)): + if (event_prefix_capp[i] in event[0]): + event_prefix = event_prefix_capp[i] + break + elif nest_unit_names[unit] == 'ntl': # nvlink + event_prefix = '' # no event_prefix for nvlink events + + print 'calling dt_event2 on event: {}'.format(event[0]); + s += dt_event2((tabs), event[0], offset, 8, event_unit,\ + event_scale, event[2], nodename, event_prefix) + + if event[0] == 'PM_XLINK_CYCLES': + xlink_cyc_event_added = True + if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE': + xlink_cyc_last_sample_event_added = True + if event[0] == 'PM_ALINK_CYCLES': + alink_cyc_event_added = True + if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE': + alink_cyc_last_sample_event_added = True + + event_processed_count = event_processed_count + 1; + +# For P8, process at least 3 sets of events so that we get to the UP_ +# and the DOWN_ events + if pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list: + if ((unit > -1) and (event_processed_count ==\ + events_per_iteration*3)): + break; + else: +# for NEST units, process as many events as there are for 1 iteration +# Applies to P9 only. + if ((unit > -1) and (event_processed_count == events_per_iteration)): + break; + s += '\t' * (tabs-1) + "};\n" + + if not (pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list): + if nest_unit_names[unit] == 'mcs': + event_prefix = event_prefix_mcs + elif nest_unit_names[unit] == 'xlink_in' or\ + nest_unit_names[unit] == 'xlink_out': + event_prefix = event_prefix_xl + elif nest_unit_names[unit] == 'capp': + event_prefix = event_prefix_capp + elif nest_unit_names[unit] == 'ntl': # nvlink + event_prefix = '' # no event_prefix for nvlink events + + return [s, event_prefix, unit_prefix]; def dt_unit_single2(tabs, unit, events, compat, nest_unit_names, nest_unit_indices, unit_prefix\ -# , unitcount, nest_unit_prefixes): - , unitcount, nest_unit_prefixes, event_prefix): - xlink_cyc_event_added = False - xlink_cyc_last_sample_event_added = False - alink_cyc_event_added = False - alink_cyc_last_sample_event_added = False - - global nest_offset_P9,nest_size_P9 - global core_thread_size_P9 - global type_chip_P9,type_core_P9,type_thread_P9 - - print('dt_unit_single2: unit: %d' %(unit)) - - if unit <= -1: - event_prefix = unit_prefix - unit_prefix = "CORE_THREAD" - else: - if not (pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list): - if (nest_unit_names[unit] == 'mba'\ - or nest_unit_names[unit] == 'phb'): - # Construct the event_prefix for MBA, PHB based on nest_unit_indices - event_prefix = "PM_" + nest_unit_names[unit].upper() +\ - str(nest_unit_indices[unit]) + "_"; - elif (nest_unit_names[unit] == 'ntl'): - event_prefix = "" # No event prefix since we have a dummy supernode /unit node for nvlink +# , unitcount, nest_unit_prefixes): + , unitcount, nest_unit_prefixes, event_prefix): + xlink_cyc_event_added = False + xlink_cyc_last_sample_event_added = False + alink_cyc_event_added = False + alink_cyc_last_sample_event_added = False + + global nest_offset_P9,nest_size_P9 + global core_thread_size_P9 + global type_chip_P9,type_core_P9,type_thread_P9 + + print('dt_unit_single2: unit: %d' %(unit)) + + if unit <= -1: + event_prefix = unit_prefix + unit_prefix = "CORE_THREAD" + else: + if not (pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list): + if (nest_unit_names[unit] == 'mba'\ + or nest_unit_names[unit] == 'phb'): + # Construct the event_prefix for MBA, PHB based on nest_unit_indices + event_prefix = "PM_" + nest_unit_names[unit].upper() +\ + str(nest_unit_indices[unit]) + "_"; + elif (nest_unit_names[unit] == 'ntl'): + event_prefix = "" # No event prefix since we have a dummy supernode /unit node for nvlink - else: - if nest_unit_prefixes[unit] == "NODEF": - event_prefix = nest_unit_names[unit].upper(); - event_prefix = "PM_" + event_prefix + str(nest_unit_indices[unit])\ - + "_"; - else: - event_prefix = nest_unit_prefixes[unit] - - s = "" - tabs += 1 - if (unit == -1): - s += '\t' * tabs +'%s {\n'% ("core") - elif (unit == -2): - s += '\t' * tabs +'%s {\n'% ("thread") - else: - # Mark only 'nx' unit as 'nx' instead of 'nx0' - if (nest_unit_names[unit] == 'nx'): - s += '\t' * tabs +'%s {\n'% (nest_unit_names[unit]) - else: - if not (pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list): # P9 - if (nest_unit_names[unit] == 'mcs'): - index = event_prefix.strip('PM_MCS').rstrip('_') - name = nest_unit_names[unit] - elif (nest_unit_names[unit] == 'xlink_in') or\ - (nest_unit_names[unit] == 'xlink_out'): - index = event_prefix.strip('PM_XLINK').rstrip('_') - name = nest_unit_names[unit].split('_')[0] # xlink instead of xlink_in/_out - elif (nest_unit_names[unit] == 'ntl'): - tmp = unit_prefix.split('_')[1].lower() # Convert NEST_NVLINK3 to nvlink3 - name = 'nvlink' - index = tmp.split(name)[1] # E.g. nvlink3 -> index=3, name=nvlink - elif (nest_unit_names[unit] == 'capp'): - index = (int)(event_prefix.strip('PM_CAPP').rstrip('_')) - 1 - name = nest_unit_names[unit] - elif (nest_unit_names[unit] == 'mba' or nest_unit_names[unit] == 'phb'\ - or nest_unit_names[unit] == 'powerbus'): - index = nest_unit_indices[unit] - name = nest_unit_names[unit] - - print('index: {}'.format(index)) - if (nest_unit_names[unit] == 'mcs'): - print('unit: {}, index: {}'.format(nest_unit_names[unit], index)) - s += '\t' * tabs +'%s%s {\n'% (name, str(index)) # To accomodate mcs '01' - else: - s += '\t' * tabs +'%s%d {\n'% (nest_unit_names[unit], nest_unit_indices[unit]) - tabs += 1 - s += '\t' * tabs + "compatible = \"%s\";\n"%compat - s += '\t' * tabs + "events-prefix = \"%s\";\n"%event_prefix - event_scale = '' - event_unit = '' - - if unit == -1: - event_scale = core_imc_scale - elif unit == -2: - event_scale = thread_imc_scale - else: # NEST - event_scale = nest_unit_scale_P9[unit] # different scale values per unit type + else: + if nest_unit_prefixes[unit] == "NODEF": + event_prefix = nest_unit_names[unit].upper(); + event_prefix = "PM_" + event_prefix + str(nest_unit_indices[unit])\ + + "_"; + else: + event_prefix = nest_unit_prefixes[unit] + + s = "" + tabs += 1 + if (unit == -1): + s += '\t' * tabs +'%s {\n'% ("core") + elif (unit == -2): + s += '\t' * tabs +'%s {\n'% ("thread") + else: + # Mark only 'nx' unit as 'nx' instead of 'nx0' + if (nest_unit_names[unit] == 'nx'): + s += '\t' * tabs +'%s {\n'% (nest_unit_names[unit]) + else: + if not (pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list): # P9 + if (nest_unit_names[unit] == 'mcs'): + index = event_prefix.strip('PM_MCS').rstrip('_') + name = nest_unit_names[unit] + elif (nest_unit_names[unit] == 'xlink_in') or\ + (nest_unit_names[unit] == 'xlink_out'): + index = event_prefix.strip('PM_XLINK').rstrip('_') + name = nest_unit_names[unit].split('_')[0] # xlink instead of xlink_in/_out + elif (nest_unit_names[unit] == 'ntl'): + tmp = unit_prefix.split('_')[1].lower() # Convert NEST_NVLINK3 to nvlink3 + name = 'nvlink' + index = tmp.split(name)[1] # E.g. nvlink3 -> index=3, name=nvlink + elif (nest_unit_names[unit] == 'capp'): + index = (int)(event_prefix.strip('PM_CAPP').rstrip('_')) - 1 + name = nest_unit_names[unit] + elif (nest_unit_names[unit] == 'mba' or nest_unit_names[unit] == 'phb'\ + or nest_unit_names[unit] == 'powerbus'): + index = nest_unit_indices[unit] + name = nest_unit_names[unit] + + print('index: {}'.format(index)) + if (nest_unit_names[unit] == 'mcs'): + print('unit: {}, index: {}'.format(nest_unit_names[unit], index)) + s += '\t' * tabs +'%s%s {\n'% (name, str(index)) # To accomodate mcs '01' + else: + s += '\t' * tabs +'%s%d {\n'% (nest_unit_names[unit], nest_unit_indices[unit]) + tabs += 1 + s += '\t' * tabs + "compatible = \"%s\";\n"%compat + s += '\t' * tabs + "events-prefix = \"%s\";\n"%event_prefix + event_scale = '' + event_unit = '' + + if unit == -1: + event_scale = core_imc_scale + elif unit == -2: + event_scale = thread_imc_scale + else: # NEST + event_scale = nest_unit_scale_P9[unit] # different scale values per unit type # Print the event_scale for all. - if (event_unit != ''): - s += '\t' * tabs + "unit = \"%s\";\n"%event_unit - if (event_scale != ''): - s += '\t' * tabs + "scale = \"%s\";\n"%event_scale - -# Need the minimum starting offset in case of core / thread - if (unit <= -1) or\ - not (pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list): # P9 and NEST - imastartoffset = 0 - event_processed_count = 0 - for i in events: - if (unit <= -1): - event = i - else: - if nest_unit_names[unit] == 'ntl': # for NVLink, imastartoffset = 0 - break - event = event_domain_1[i] + if (event_unit != ''): + s += '\t' * tabs + "unit = \"%s\";\n"%event_unit + if (event_scale != ''): + s += '\t' * tabs + "scale = \"%s\";\n"%event_scale - if event_processed_count == 0: - imastartoffset = event[1] +# Need the minimum starting offset in case of core / thread + if (unit <= -1) or\ + not (pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list): # P9 and NEST + imastartoffset = 0 + event_processed_count = 0 + for i in events: + if (unit <= -1): + event = i + else: + if nest_unit_names[unit] == 'ntl': # for NVLink, imastartoffset = 0 + break + event = event_domain_1[i] + + if event_processed_count == 0: + imastartoffset = event[1] # MCS node can not have *PB_CYC* event - if nest_unit_names[unit] == 'mcs' and (event[0]=='PM_PB_CYC'\ - or event[0]=='PM_PB_CYC2'): - print('skipping event {} for unit {}'.format(event[0], nest_unit_names[unit])) - event_processed_count = event_processed_count + 1 - continue - if nest_unit_names[unit] == 'phb': - print('event: {}, start offset: {}'.format(event[0], event[1])) - if event[1] < imastartoffset: - imastartoffset = event[1] - if nest_unit_names[unit] == 'phb': - print('imastartoffset set to: {}'.format(imastartoffset)) - event_processed_count = event_processed_count + 1 - event_processed_count = 0 - - if (unit <= -1): -# event = event_domain_2[i] - s += '\t' * tabs + "reg = <0x%x 0x8>;\n"%imastartoffset - s += '\t' * tabs + "events = < &%s >;\n"%unit_prefix - if (unit == -1): - s += '\t' * tabs + "type = <0x%x>;\n"%type_core_P9 - else: - s += '\t' * tabs + "type = <0x%x>;\n"%type_thread_P9 - s += '\t' * tabs + "size = <0x%x>;\n"%core_thread_size_P9 - else: - for i in events: - event = event_domain_1[i] - print 'event: [0]: {}, [1]: {}, [2]: {}'.format(event[0],event[1],event[2]) - if event[0] == 'PM_XLINK_CYCLES' and xlink_cyc_event_added == True: - continue - if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE' and \ - xlink_cyc_last_sample_event_added == True: - continue - if event[0] == 'PM_ALINK_CYCLES' and alink_cyc_event_added == True: - continue - if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE' and \ - alink_cyc_last_sample_event_added == True: - continue - nodename = "event" - if nest_unit_names[unit] == 'mcs': # Setting event unit and scale to 'N/A' - # for unit 'MCS' as it is covered already - event_unit = 'N/A' - event_scale = 'N/A' - - if event[0] == 'PM_XLINK_CYCLES': - xlink_cyc_event_added = True - if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE': - xlink_cyc_last_sample_event_added = True - if event[0] == 'PM_ALINK_CYCLES': - alink_cyc_event_added = True - if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE': - alink_cyc_last_sample_event_added = True - -# Do not include 'RESERVED' events. Look for the first non-'RESERVED' event -# and use its offset to write the node. - if (event[0] != 'RESERVED'): - if not (pvrvalue in p8_reduced_pvr_list or\ - pvrvalue in p8_pvr_list): # P9 and NEST - s += '\t' * tabs + "reg = <0x%x 0x8>;\n"%imastartoffset - else: - s += '\t' * tabs + "reg = <0x%x 0x8>;\n"%event[1] - s += '\t' * tabs + "events = < &%s >;\n"%unit_prefix - s += '\t' * tabs + "type = <0x%x>;\n"%type_chip_P9 - s += '\t' * tabs + "size = <0x%x>;\n"%nest_size_P9 - s += '\t' * tabs + "offset = <0x%x>;\n"%nest_offset_P9 - s += '\t' * tabs + "cb_offset = <0x%x>;\n"%cb_nest_offset_P9 - break; - - tabs -= 1; -# s += '\t' * (tabs-1) + "};\n" - s += '\t' * (tabs) + "};\n" - return s + if nest_unit_names[unit] == 'mcs' and (event[0]=='PM_PB_CYC'\ + or event[0]=='PM_PB_CYC2'): + print('skipping event {} for unit {}'.format(event[0], nest_unit_names[unit])) + event_processed_count = event_processed_count + 1 + continue + if nest_unit_names[unit] == 'phb': + print('event: {}, start offset: {}'.format(event[0], event[1])) + if event[1] < imastartoffset: + imastartoffset = event[1] + if nest_unit_names[unit] == 'phb': + print('imastartoffset set to: {}'.format(imastartoffset)) + event_processed_count = event_processed_count + 1 + event_processed_count = 0 + + if (unit <= -1): +# event = event_domain_2[i] + s += '\t' * tabs + "reg = <0x%x 0x8>;\n"%imastartoffset + s += '\t' * tabs + "events = < &%s >;\n"%unit_prefix + if (unit == -1): + s += '\t' * tabs + "type = <0x%x>;\n"%type_core_P9 + else: + s += '\t' * tabs + "type = <0x%x>;\n"%type_thread_P9 + s += '\t' * tabs + "size = <0x%x>;\n"%core_thread_size_P9 + else: + for i in events: + event = event_domain_1[i] + print 'event: [0]: {}, [1]: {}, [2]: {}'.format(event[0],event[1],event[2]) + if event[0] == 'PM_XLINK_CYCLES' and xlink_cyc_event_added == True: + continue + if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE' and \ + xlink_cyc_last_sample_event_added == True: + continue + if event[0] == 'PM_ALINK_CYCLES' and alink_cyc_event_added == True: + continue + if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE' and \ + alink_cyc_last_sample_event_added == True: + continue + nodename = "event" + if nest_unit_names[unit] == 'mcs': # Setting event unit and scale to 'N/A' + # for unit 'MCS' as it is covered already + event_unit = 'N/A' + event_scale = 'N/A' + + if event[0] == 'PM_XLINK_CYCLES': + xlink_cyc_event_added = True + if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE': + xlink_cyc_last_sample_event_added = True + if event[0] == 'PM_ALINK_CYCLES': + alink_cyc_event_added = True + if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE': + alink_cyc_last_sample_event_added = True + +# Do not include 'RESERVED' events. Look for the first non-'RESERVED' event +# and use its offset to write the node. + if (event[0] != 'RESERVED'): + if not (pvrvalue in p8_reduced_pvr_list or\ + pvrvalue in p8_pvr_list): # P9 and NEST + s += '\t' * tabs + "reg = <0x%x 0x8>;\n"%imastartoffset + else: + s += '\t' * tabs + "reg = <0x%x 0x8>;\n"%event[1] + s += '\t' * tabs + "events = < &%s >;\n"%unit_prefix + s += '\t' * tabs + "type = <0x%x>;\n"%type_chip_P9 + s += '\t' * tabs + "size = <0x%x>;\n"%nest_size_P9 + s += '\t' * tabs + "offset = <0x%x>;\n"%nest_offset_P9 + s += '\t' * tabs + "cb_offset = <0x%x>;\n"%cb_nest_offset_P9 + break; + + tabs -= 1; +# s += '\t' * (tabs-1) + "};\n" + s += '\t' * (tabs) + "};\n" + return s # This routine prints out the events and data per unit in the following format @@ -1103,276 +1103,276 @@ def dt_unit_single2(tabs, unit, events, compat, nest_unit_names, nest_unit_indic # <-------------- end of sample format --------------------> def dt_unit_single(tabs,unit,events, compat, nest_unit_names, unit_prefix, nest_unit_indices, nest_unit_prefixes): # Print one single unit at a time (e.g. MCS0) - xlink_cyc_event_added = False - xlink_cyc_last_sample_event_added = False - alink_cyc_event_added = False - alink_cyc_last_sample_event_added = False - - if unit <= -1: - event_prefix = unit_prefix - unit_prefix = "CORE_THREAD" + xlink_cyc_event_added = False + xlink_cyc_last_sample_event_added = False + alink_cyc_event_added = False + alink_cyc_last_sample_event_added = False + + if unit <= -1: + event_prefix = unit_prefix + unit_prefix = "CORE_THREAD" + else: + if nest_unit_prefixes[unit] == "NODEF": + event_prefix = nest_unit_names[unit].upper(); + event_prefix = "PM_" + event_prefix + str(nest_unit_indices[unit])\ + + "_"; else: - if nest_unit_prefixes[unit] == "NODEF": - event_prefix = nest_unit_names[unit].upper(); - event_prefix = "PM_" + event_prefix + str(nest_unit_indices[unit])\ - + "_"; - else: - event_prefix = nest_unit_prefixes[unit] - - s = "" - tabs += 1 - if (unit == -1): - s += '\t' * tabs +'%s {\n'% ("core") - elif (unit == -2): - s += '\t' * tabs +'%s {\n'% ("thread") + event_prefix = nest_unit_prefixes[unit] + + s = "" + tabs += 1 + if (unit == -1): + s += '\t' * tabs +'%s {\n'% ("core") + elif (unit == -2): + s += '\t' * tabs +'%s {\n'% ("thread") + else: + # Mark only 'nx' unit as 'nx' instead of 'nx0' + if (nest_unit_names[unit] == 'nx'): + s += '\t' * tabs +'%s {\n'% (nest_unit_names[unit]) else: - # Mark only 'nx' unit as 'nx' instead of 'nx0' - if (nest_unit_names[unit] == 'nx'): - s += '\t' * tabs +'%s {\n'% (nest_unit_names[unit]) - else: - s += '\t' * tabs +'%s%d {\n'% (nest_unit_names[unit], nest_unit_indices[unit]) - tabs += 1 - s += '\t' * tabs + "compatible = \"%s\";\n"%compat - s += '\t' * tabs + "events-prefix = \"%s\";\n"%event_prefix + s += '\t' * tabs +'%s%d {\n'% (nest_unit_names[unit], nest_unit_indices[unit]) + tabs += 1 + s += '\t' * tabs + "compatible = \"%s\";\n"%compat + s += '\t' * tabs + "events-prefix = \"%s\";\n"%event_prefix - event_scale = '' - event_unit = '' + event_scale = '' + event_unit = '' - if unit == -1: - event_scale = core_imc_scale - elif unit == -2: - event_scale = thread_imc_scale + if unit == -1: + event_scale = core_imc_scale + elif unit == -2: + event_scale = thread_imc_scale - if ((unit == -1) or (unit == -2)): # Print a common unit and scale only if core or thread - if (event_unit != ''): - s += '\t' * tabs + "unit = \"%s\";\n"%event_unit - if (event_scale != ''): - s += '\t' * tabs + "scale = \"%s\";\n"%event_scale + if ((unit == -1) or (unit == -2)): # Print a common unit and scale only if core or thread + if (event_unit != ''): + s += '\t' * tabs + "unit = \"%s\";\n"%event_unit + if (event_scale != ''): + s += '\t' * tabs + "scale = \"%s\";\n"%event_scale # Need the minimum starting offset in case of core / thread - if (unit <= -1): - imastartoffset = 0 - event_processed_count = 0 - for i in events: - event = i - if event_processed_count == 0: - imastartoffset = event[1] - if event[1] < imastartoffset: - imastartoffset = event[1] - event_processed_count = event_processed_count + 1 - event_processed_count = 0 - - if (unit <= -1): - s += '\t' * tabs + "reg = <0x%x 0x8>;\n"%imastartoffset - s += '\t' * tabs + "events = < &%s >;\n"%unit_prefix - if (unit == -1): - s += '\t' * tabs + "type = <0x%x>;\n"%type_core - else: - s += '\t' * tabs + "type = <0x%x>;\n"%type_thread - s += '\t' * tabs + "size = <0x%x>;\n"%core_thread_size + if (unit <= -1): + imastartoffset = 0 + event_processed_count = 0 + for i in events: + event = i + if event_processed_count == 0: + imastartoffset = event[1] + if event[1] < imastartoffset: + imastartoffset = event[1] + event_processed_count = event_processed_count + 1 + event_processed_count = 0 + + if (unit <= -1): + s += '\t' * tabs + "reg = <0x%x 0x8>;\n"%imastartoffset + s += '\t' * tabs + "events = < &%s >;\n"%unit_prefix + if (unit == -1): + s += '\t' * tabs + "type = <0x%x>;\n"%type_core else: - for i in events: - event = event_domain_1[i] - print 'event: [0]: {}, [1]: {}, [2]: {}'.format(event[0],event[1],event[2]) - if event[0] == 'PM_XLINK_CYCLES' and xlink_cyc_event_added == True: - continue - if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE' and \ - xlink_cyc_last_sample_event_added == True: - continue - if event[0] == 'PM_ALINK_CYCLES' and alink_cyc_event_added == True: - continue - if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE' and \ - alink_cyc_last_sample_event_added == True: - continue - nodename = "event" - if nest_unit_names[unit] == 'mcs': # Setting event unit and scale to 'N/A' - # for unit 'MCS' as it is covered already - event_unit = 'N/A' - event_scale = 'N/A' - - if event[0] == 'PM_XLINK_CYCLES': - xlink_cyc_event_added = True - if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE': - xlink_cyc_last_sample_event_added = True - if event[0] == 'PM_ALINK_CYCLES': - alink_cyc_event_added = True - if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE': - alink_cyc_last_sample_event_added = True - -# Do not include 'RESERVED' events - if (event[0] != 'RESERVED'): - s += '\t' * tabs + "reg = <0x%x 0x8>;\n"%event[1] - s += '\t' * tabs + "events = < &%s >;\n"%unit_prefix - s += '\t' * tabs + "type = <0x%x>;\n"%type_chip - s += '\t' * tabs + "size = <0x%x>;\n"%nest_size - s += '\t' * tabs + "offset = <0x%x>;\n"%nest_offset - s += '\t' * tabs + "cb_offset = <0x%x>;\n"%cb_nest_offset - print 'added data for event: {}'.format(event[0]) - break; - -# Assuming for P8 we do not need to reduce the tabs count - s += '\t' * (tabs-1) + "};\n" - return s + s += '\t' * tabs + "type = <0x%x>;\n"%type_thread + s += '\t' * tabs + "size = <0x%x>;\n"%core_thread_size + else: + for i in events: + event = event_domain_1[i] + print 'event: [0]: {}, [1]: {}, [2]: {}'.format(event[0],event[1],event[2]) + if event[0] == 'PM_XLINK_CYCLES' and xlink_cyc_event_added == True: + continue + if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE' and \ + xlink_cyc_last_sample_event_added == True: + continue + if event[0] == 'PM_ALINK_CYCLES' and alink_cyc_event_added == True: + continue + if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE' and \ + alink_cyc_last_sample_event_added == True: + continue + nodename = "event" + if nest_unit_names[unit] == 'mcs': # Setting event unit and scale to 'N/A' + # for unit 'MCS' as it is covered already + event_unit = 'N/A' + event_scale = 'N/A' + + if event[0] == 'PM_XLINK_CYCLES': + xlink_cyc_event_added = True + if event[0] == 'PM_XLINK_CYCLES_LAST_SAMPLE': + xlink_cyc_last_sample_event_added = True + if event[0] == 'PM_ALINK_CYCLES': + alink_cyc_event_added = True + if event[0] == 'PM_ALINK_CYCLES_LAST_SAMPLE': + alink_cyc_last_sample_event_added = True + +# Do not include 'RESERVED' events + if (event[0] != 'RESERVED'): + s += '\t' * tabs + "reg = <0x%x 0x8>;\n"%event[1] + s += '\t' * tabs + "events = < &%s >;\n"%unit_prefix + s += '\t' * tabs + "type = <0x%x>;\n"%type_chip + s += '\t' * tabs + "size = <0x%x>;\n"%nest_size + s += '\t' * tabs + "offset = <0x%x>;\n"%nest_offset + s += '\t' * tabs + "cb_offset = <0x%x>;\n"%cb_nest_offset + print 'added data for event: {}'.format(event[0]) + break; + +# Assuming for P8 we do not need to reduce the tabs count + s += '\t' * (tabs-1) + "};\n" + return s def core_imc_dt_unit(tabs, events): - s = "" - groupname = "core" - s += '\t' * tabs + '%s {\n' % (groupname) - tabs +=1 - s += '\t' * tabs + "compatible = \"%s\";\n" % "ibm,imc-counters-core" - s += '\t' * tabs + "ranges;\n" - s += '\t' * tabs + "#address-cells = <0x1>;\n" - s += '\t' * tabs + "#size-cells = <0x1>;\n" - s += '\t' * tabs + "scale = \"%s\";\n\n"%core_imc_scale - - event_count = 0 - for i in events: - nodename = "event" - # core_imc_scale is added in the parent node itself. So not adding in the event nodes - # Do not print 'RESERVED' events - if (i[0] != 'RESERVED'): - s += dt_event(tabs, i[0], i[1], 8, '', '', i[2], nodename) - event_count = event_count + 1 - s += "\n" - s += '\t' * (tabs - 1) + "};\n" - return s + s = "" + groupname = "core" + s += '\t' * tabs + '%s {\n' % (groupname) + tabs +=1 + s += '\t' * tabs + "compatible = \"%s\";\n" % "ibm,imc-counters-core" + s += '\t' * tabs + "ranges;\n" + s += '\t' * tabs + "#address-cells = <0x1>;\n" + s += '\t' * tabs + "#size-cells = <0x1>;\n" + s += '\t' * tabs + "scale = \"%s\";\n\n"%core_imc_scale + + event_count = 0 + for i in events: + nodename = "event" + # core_imc_scale is added in the parent node itself. So not adding in the event nodes + # Do not print 'RESERVED' events + if (i[0] != 'RESERVED'): + s += dt_event(tabs, i[0], i[1], 8, '', '', i[2], nodename) + event_count = event_count + 1 + s += "\n" + s += '\t' * (tabs - 1) + "};\n" + return s # Print the common node for core and thread def core_thread_imc_dt_unit2_common(tabs, unit, events, compat, unit_names, unit_indices, unit_count, unit_prefixes): - # First print the common data for the unit - [unit_common_string, event_prefix, unit_prefix] = dt_unit_common(tabs, unit, events, compat, \ - unit_names, unit_indices, unit_count, unit_prefixes); + # First print the common data for the unit + [unit_common_string, event_prefix, unit_prefix] = dt_unit_common(tabs, unit, events, compat, \ + unit_names, unit_indices, unit_count, unit_prefixes); - # event_prefix is set to 'CPM_' once dt_unit_common() returns. - return [unit_common_string, event_prefix] + # event_prefix is set to 'CPM_' once dt_unit_common() returns. + return [unit_common_string, event_prefix] # Print the core-specific unit only def core_imc_dt_unit2(tabs, unit, events, compat, unit_names, unit_indices, unit_prefix, unit_count, unit_prefixes): - s = "" - event_prefix = '' # dummy. This is used within dt_unit2() - s += dt_unit_single2(tabs, unit, events, compat, unit_names, unit_indices, unit_prefix, unit_count, unit_prefixes, event_prefix) + s = "" + event_prefix = '' # dummy. This is used within dt_unit2() + s += dt_unit_single2(tabs, unit, events, compat, unit_names, unit_indices, unit_prefix, unit_count, unit_prefixes, event_prefix) - return s + return s def thread_imc_dt_unit2(tabs, unit, events, compat, unit_names, unit_indices, unit_prefix, unit_count, unit_prefixes): - s = "" - event_prefix = '' # dummy. This is used within dt_unit2() - s += dt_unit_single2(tabs, unit, events, compat, unit_names, unit_indices, unit_prefix, unit_count, unit_prefixes, event_prefix) + s = "" + event_prefix = '' # dummy. This is used within dt_unit2() + s += dt_unit_single2(tabs, unit, events, compat, unit_names, unit_indices, unit_prefix, unit_count, unit_prefixes, event_prefix) - return s + return s def thread_imc_dt_unit(tabs, events): - s = "" - groupname = "thread" - s += '\t' * tabs + '%s {\n' % (groupname) - tabs +=1 - s += '\t' * tabs + "compatible = \"%s\";\n" % "ibm,imc-counters-thread" - s += '\t' * tabs + "ranges;\n" - s += '\t' * tabs + "#address-cells = <0x1>;\n" - s += '\t' * tabs + "#size-cells = <0x1>;\n" - s += '\t' * tabs + "scale = \"%s\";\n\n"%thread_imc_scale - - event_count = 0 - for i in events: - nodename = "event" - if (i[0] != 'RESERVED'): - s += dt_event(tabs, i[0], i[1], 8, '', '', i[2], nodename) - event_count = event_count + 1 - s += "\n" - s += '\t' * (tabs - 1) + "};\n" - return s + s = "" + groupname = "thread" + s += '\t' * tabs + '%s {\n' % (groupname) + tabs +=1 + s += '\t' * tabs + "compatible = \"%s\";\n" % "ibm,imc-counters-thread" + s += '\t' * tabs + "ranges;\n" + s += '\t' * tabs + "#address-cells = <0x1>;\n" + s += '\t' * tabs + "#size-cells = <0x1>;\n" + s += '\t' * tabs + "scale = \"%s\";\n\n"%thread_imc_scale + + event_count = 0 + for i in events: + nodename = "event" + if (i[0] != 'RESERVED'): + s += dt_event(tabs, i[0], i[1], 8, '', '', i[2], nodename) + event_count = event_count + 1 + s += "\n" + s += '\t' * (tabs - 1) + "};\n" + return s def gen_dtb(ofname, odtbfname): dtb_command = "dtc -I dts -O dtb -o " + odtbfname + " ./" + ofname if odtbfname == '': - print 'Output DTB filename missing. Specify -d <DTB filename> and retry. Exiting.' - exit(-1) + print 'Output DTB filename missing. Specify -d <DTB filename> and retry. Exiting.' + exit(-1) try: - os.system(dtb_command) + os.system(dtb_command) except: - print 'Error in dtb command: {}'.format(dtb_command) + print 'Error in dtb command: {}'.format(dtb_command) print 'Generated DTB file: {}'.format(odtbfname) def get_unit_count(unitname, nest_unit_names_multi, nest_unit_count_multi): - unitcount = 1 # A minimum of 1 unit if it isnt a multi count unit - - print 'in get_unit_count. nest_unit_names_multi: {}'.format(nest_unit_names_multi) - print 'in get_unit_count. nest_unit_count_multi: {}'.format(nest_unit_count_multi) - print 'in get_unit_count. unitname: {}'.format(unitname) - for k in range(len(nest_unit_names_multi)): - print 'get_unit_count: matching {} with {}'.format(unitname, nest_unit_names_multi[k]) - if unitname == nest_unit_names_multi[k]: - unitcount = nest_unit_count_multi[k] - break - return unitcount - + unitcount = 1 # A minimum of 1 unit if it isnt a multi count unit + + print 'in get_unit_count. nest_unit_names_multi: {}'.format(nest_unit_names_multi) + print 'in get_unit_count. nest_unit_count_multi: {}'.format(nest_unit_count_multi) + print 'in get_unit_count. unitname: {}'.format(unitname) + for k in range(len(nest_unit_names_multi)): + print 'get_unit_count: matching {} with {}'.format(unitname, nest_unit_names_multi[k]) + if unitname == nest_unit_names_multi[k]: + unitcount = nest_unit_count_multi[k] + break + return unitcount + def gen_dts(ifname, verbose, ofname, unitname, pvrname, threadimc, coreimc): - try: - fn = open(ifname, "rb") - except: - print 'Input filename missing. Specify -i <catalog lid file name> and retry.. Exiting.' - exit(-1) - - try: - of = open(ofname, "w") - except: - print 'Output filename missing. Specify -o <output file name> and retry.. Exiting.' - exit(-1) - - if pvrname == '': # pvr name was not specified. - print "pvr name was not specified. Defaulting to 4D0200.." + try: + fn = open(ifname, "rb") + except: + print 'Input filename missing. Specify -i <catalog lid file name> and retry.. Exiting.' + exit(-1) + + try: + of = open(ofname, "w") + except: + print 'Output filename missing. Specify -o <output file name> and retry.. Exiting.' + exit(-1) + + if pvrname == '': # pvr name was not specified. + print "pvr name was not specified. Defaulting to 4D0200.." pvrname = "4D0200" - pvr_list = pvrname.split(',') - global p8_pvr_list, p8_reduced_pvr_list, p9_pvr_list - global pvrvalue + pvr_list = pvrname.split(',') + global p8_pvr_list, p8_reduced_pvr_list, p9_pvr_list + global pvrvalue # Assuming we do not add P8 and P9 PVRs together. - for pvr in pvr_list: - pvrvalue = pvr # set the global. Used within dt_event2() - print 'pvr: {}'.format(pvr) # debug - if pvr in p9_pvr_list: - nest_unit_names = nest_unit_names_P9 - nest_unit_indices = nest_unit_indices_P9 - nest_units = nest_units_P9 - nest_unit_names_multi = nest_unit_names_multi_P9 - nest_unit_count_multi = nest_unit_count_multi_P9 - nest_unit_prefixes = nest_unit_prefixes_P9 - else: # P8 - nest_unit_names = nest_unit_names_P8 - nest_unit_indices = nest_unit_indices_P8 - nest_units = nest_units_P8 - nest_unit_names_multi = nest_unit_names_multi_P8 - nest_unit_count_multi = nest_unit_count_multi_P8 - nest_unit_prefixes = nest_unit_prefixes_P8 - print 'set nest unit prefixes for P8: {}'.format(nest_unit_prefixes) #debug - - print 'nest_unit_names: {}'.format(nest_unit_names) + for pvr in pvr_list: + pvrvalue = pvr # set the global. Used within dt_event2() + print 'pvr: {}'.format(pvr) # debug + if pvr in p9_pvr_list: + nest_unit_names = nest_unit_names_P9 + nest_unit_indices = nest_unit_indices_P9 + nest_units = nest_units_P9 + nest_unit_names_multi = nest_unit_names_multi_P9 + nest_unit_count_multi = nest_unit_count_multi_P9 + nest_unit_prefixes = nest_unit_prefixes_P9 + else: # P8 + nest_unit_names = nest_unit_names_P8 + nest_unit_indices = nest_unit_indices_P8 + nest_units = nest_units_P8 + nest_unit_names_multi = nest_unit_names_multi_P8 + nest_unit_count_multi = nest_unit_count_multi_P8 + nest_unit_prefixes = nest_unit_prefixes_P8 + print 'set nest unit prefixes for P8: {}'.format(nest_unit_prefixes) #debug + + print 'nest_unit_names: {}'.format(nest_unit_names) # the page0 catalog is 128 bytes long - page0 = Page0(fn.read(128)) - Events(fn, page0.get_events_start(), page0.get_events_count()) + page0 = Page0(fn.read(128)) + Events(fn, page0.get_events_start(), page0.get_events_count()) # Need to pass the nest_unit information as it is set in the scope of gen_dts() - Groups(fn, page0.get_group_start(), page0.get_group_count(), nest_units) + Groups(fn, page0.get_group_start(), page0.get_group_count(), nest_units) - print 'version from LID: {}'.format(hex(int(page0.get_pvr_and_version()) & 0xFFFF)) - LID_version = hex(int(page0.get_pvr_and_version()) & 0xFFFF) - LID_version = LID_version.rstrip('LX') # strip out the trailing 'L' + print 'version from LID: {}'.format(hex(int(page0.get_pvr_and_version()) & 0xFFFF)) + LID_version = hex(int(page0.get_pvr_and_version()) & 0xFFFF) + LID_version = LID_version.rstrip('LX') # strip out the trailing 'L' - s =\ -""" -/dts-v1/; + s =\ + """ + /dts-v1/; -/ { -\tname = ""; -\tcompatible = \"ibm,opal-in-memory-counters\"; -\t#address-cells = <0x1>; -\t#size-cells = <0x1>; -""" + / { + \tname = ""; + \tcompatible = \"ibm,opal-in-memory-counters\"; + \t#address-cells = <0x1>; + \t#size-cells = <0x1>; + """ # Per latest change, nest-offset and nest-size should be in each unit's node (22-may) # if pvr_list[0] in p9_pvr_list: # change the nest offset and size based on PVR (P9/P8) # s += \ @@ -1388,132 +1388,132 @@ def gen_dts(ifname, verbose, ofname, unitname, pvrname, threadimc, coreimc): #""" # End change (22-may) - s += "\tversion-id = <{}>;\n\n".format(LID_version) - for pvr in pvr_list: + s += "\tversion-id = <{}>;\n\n".format(LID_version) + for pvr in pvr_list: pvr_str = '\tpvr@' + pvr + ' {' - if pvr in p9_pvr_list: - pvr_node =\ -""" -\t\t#address-cells = <0x1>; -\t\t#size-cells = <0x1>; -\t\timc-nest-offset = <0x180000>; -\t\timc-nest-size = <0x40000>; -\t\tversion-id = \"\"; -""" - else: - pvr_node =\ -""" -\t\t#address-cells = <0x1>; -\t\t#size-cells = <0x1>; -\t\timc-nest-offset = <0x320000>; -\t\timc-nest-size = <0x80000>; -\t\tversion-id = \"\"; -""" + if pvr in p9_pvr_list: + pvr_node =\ + """ + \t\t#address-cells = <0x1>; + \t\t#size-cells = <0x1>; + \t\timc-nest-offset = <0x180000>; + \t\timc-nest-size = <0x40000>; + \t\tversion-id = \"\"; + """ + else: + pvr_node =\ + """ + \t\t#address-cells = <0x1>; + \t\t#size-cells = <0x1>; + \t\timc-nest-offset = <0x320000>; + \t\timc-nest-size = <0x80000>; + \t\tversion-id = \"\"; + """ tabs = 0 if pvr not in p9_pvr_list: # Handle P8 differently - for i in range(len(nest_units)): + for i in range(len(nest_units)): if unitname != 'all' and unitname != '': # specific unit indicated. Print that unit only - if nest_unit_names[i] == unitname: + if nest_unit_names[i] == unitname: if i < len(nest_unit_names): - if (len(group_chip[i])): # are there events associated with the unit? - unitcount = get_unit_count(unitname, nest_unit_names_multi, nest_unit_count_multi) - s += dt_unit(tabs,i,group_chip[i], "ibm,imc-counters", nest_unit_names, nest_unit_indices, unitcount, nest_unit_prefixes) + if (len(group_chip[i])): # are there events associated with the unit? + unitcount = get_unit_count(unitname, nest_unit_names_multi, nest_unit_count_multi) + s += dt_unit(tabs,i,group_chip[i], "ibm,imc-counters", nest_unit_names, nest_unit_indices, unitcount, nest_unit_prefixes) break elif unitname == 'all': # Include all NEST units - if i < len(nest_unit_names): - if (len(group_chip[i])): - unitcount = get_unit_count(nest_unit_names[i], nest_unit_names_multi, nest_unit_count_multi) - s += dt_unit(tabs,i,group_chip[i], "ibm,imc-counters", nest_unit_names, nest_unit_indices, unitcount, nest_unit_prefixes) + if i < len(nest_unit_names): + if (len(group_chip[i])): + unitcount = get_unit_count(nest_unit_names[i], nest_unit_names_multi, nest_unit_count_multi) + s += dt_unit(tabs,i,group_chip[i], "ibm,imc-counters", nest_unit_names, nest_unit_indices, unitcount, nest_unit_prefixes) else: # no unit name was explicitly specified. Assume 'mcs' if pvrname is 4D0200 - if pvrname in p8_reduced_pvr_list: # 4D0200 only - if nest_unit_names[i] == 'mcs': - if i < len(nest_unit_names): + if pvrname in p8_reduced_pvr_list: # 4D0200 only + if nest_unit_names[i] == 'mcs': + if i < len(nest_unit_names): if (len(group_chip[i])): - unitcount = get_unit_count(nest_unit_names[i], nest_unit_names_multi, nest_unit_count_multi) - s += dt_unit(tabs,i,group_chip[i], "ibm,imc-counters", nest_unit_names, nest_unit_indices, unitcount, nest_unit_prefixes) - break - else: # pvrname is not 4D0200. Print all NEST units + unitcount = get_unit_count(nest_unit_names[i], nest_unit_names_multi, nest_unit_count_multi) + s += dt_unit(tabs,i,group_chip[i], "ibm,imc-counters", nest_unit_names, nest_unit_indices, unitcount, nest_unit_prefixes) + break + else: # pvrname is not 4D0200. Print all NEST units if i < len(nest_unit_names): - if (len(group_chip[i])): - unitcount = get_unit_count(nest_unit_names[i], nest_unit_names_multi, nest_unit_count_multi) - s += dt_unit(tabs,i,group_chip[i], "ibm,imc-counters", nest_unit_names, nest_unit_indices, unitcount, nest_unit_prefixes) + if (len(group_chip[i])): + unitcount = get_unit_count(nest_unit_names[i], nest_unit_names_multi, nest_unit_count_multi) + s += dt_unit(tabs,i,group_chip[i], "ibm,imc-counters", nest_unit_names, nest_unit_indices, unitcount, nest_unit_prefixes) else: # for P9 DD1 (4E0100) print core and thread imc by default. Add the supported NEST units too. - coreimc = "yes" - threadimc = "yes" - nvlink_P9 = {} - - for i in range(len(nest_unit_names_supported_P9)): - print('len(nest_units): {}'.format(len(nest_units))) - for j in range(len(nest_units)): - print 'matching : {} with {}'.format(nest_unit_names_supported_P9[i],nest_unit_names[j]) - if nest_unit_names[j] == nest_unit_names_supported_P9[i]: - if j < len(nest_unit_names): - if (len(group_chip[j])): # There are events associated with this unit - print 'group_chip: {}'.format(group_chip[j]) - if (nest_unit_names[j] == 'ntl'): # nvlink. Group them per unit - nvlink_P9 = dt_group_nvlink_events_P9(group_chip[j]) - unitcount = len(nvlink_P9) - for k,v in nvlink_P9.items(): # call it once per nvlink unit + coreimc = "yes" + threadimc = "yes" + nvlink_P9 = {} + + for i in range(len(nest_unit_names_supported_P9)): + print('len(nest_units): {}'.format(len(nest_units))) + for j in range(len(nest_units)): + print 'matching : {} with {}'.format(nest_unit_names_supported_P9[i],nest_unit_names[j]) + if nest_unit_names[j] == nest_unit_names_supported_P9[i]: + if j < len(nest_unit_names): + if (len(group_chip[j])): # There are events associated with this unit + print 'group_chip: {}'.format(group_chip[j]) + if (nest_unit_names[j] == 'ntl'): # nvlink. Group them per unit + nvlink_P9 = dt_group_nvlink_events_P9(group_chip[j]) + unitcount = len(nvlink_P9) + for k,v in nvlink_P9.items(): # call it once per nvlink unit s += dt_unit2(tabs, j, v, "ibm,imc-counters", nest_unit_names, nest_unit_indices, unitcount, nest_unit_prefixes) - else: - unitcount = get_unit_count(nest_unit_names[j], nest_unit_names_multi, nest_unit_count_multi) - print 'writing out unit for {}'.format(nest_unit_names[j]); - s += dt_unit2(tabs,j,group_chip[j], "ibm,imc-counters", nest_unit_names, nest_unit_indices, unitcount, nest_unit_prefixes) - break + else: + unitcount = get_unit_count(nest_unit_names[j], nest_unit_names_multi, nest_unit_count_multi) + print 'writing out unit for {}'.format(nest_unit_names[j]); + s += dt_unit2(tabs,j,group_chip[j], "ibm,imc-counters", nest_unit_names, nest_unit_indices, unitcount, nest_unit_prefixes) + break if coreimc == "yes": - [common_string, unit_prefix] = core_thread_imc_dt_unit2_common(tabs, -1, event_domain_2, "ibm,imc-counters", nest_unit_names, nest_unit_indices, 1, nest_unit_prefixes) - s += common_string - s += core_imc_dt_unit2(tabs, -1, event_domain_2, "ibm,imc-counters", nest_unit_names, nest_unit_indices, unit_prefix, 1, nest_unit_prefixes) # last 4 fields unused + [common_string, unit_prefix] = core_thread_imc_dt_unit2_common(tabs, -1, event_domain_2, "ibm,imc-counters", nest_unit_names, nest_unit_indices, 1, nest_unit_prefixes) + s += common_string + s += core_imc_dt_unit2(tabs, -1, event_domain_2, "ibm,imc-counters", nest_unit_names, nest_unit_indices, unit_prefix, 1, nest_unit_prefixes) # last 4 fields unused if threadimc == "yes": - if coreimc != "yes": - [common_string, unit_prefix] = core_thread_imc_dt_unit2_common(tabs, -2, event_domain_2_a, "ibm,imc-counters", nest_unit_names, nest_unit_indices, 1, nest_unit_prefixes) - s += common_string - s += thread_imc_dt_unit2(tabs, -2, event_domain_2_a, "ibm,imc-counters", nest_unit_names, nest_unit_indices, unit_prefix, 1, nest_unit_prefixes) # last 4 fields unused - s += "};\n" + if coreimc != "yes": + [common_string, unit_prefix] = core_thread_imc_dt_unit2_common(tabs, -2, event_domain_2_a, "ibm,imc-counters", nest_unit_names, nest_unit_indices, 1, nest_unit_prefixes) + s += common_string + s += thread_imc_dt_unit2(tabs, -2, event_domain_2_a, "ibm,imc-counters", nest_unit_names, nest_unit_indices, unit_prefix, 1, nest_unit_prefixes) # last 4 fields unused + s += "};\n" - of.write(s) - of.close - print 'Generated DTS file: {}'.format(ofname) + of.write(s) + of.close + print 'Generated DTS file: {}'.format(ofname) if __name__ == "__main__": - ifname = "" # input file name - ofname = "" # output file name - verbose = False - coreimc = "no" # Do not print core imc by default (if no unit was explicitly specified) - threadimc = "no" # Do not print thread imc by default (if no unit was explicitly specified) - pvrname = "" - unitname = "" - odtbfname = "" # output dtb file name - - options, remainder = getopt.getopt(sys.argv[1:], 'c:d:i:p:t:u:vo:', ['coreimc=', - 'outputdtb=', - 'input=', - 'pvr=', - 'threadimc=', - 'unit=', - 'verbose', - 'output=' - ]) - - for opt, arg in options: - if opt in ('-c', '--core'): - coreimc = arg - elif opt in ('-i', '--input'): - ifname = arg - elif opt in ('-p', '--pvr'): - pvrname = arg - elif opt in ('-t', '--thread'): - threadimc = arg - elif opt in ('-u', '--unit'): - unitname = arg - elif opt in ('-v', '--verbose'): - verbose = True - elif opt in ('-o', '--output'): - ofname = arg - elif opt in ('-d', '--outputdtb'): - odtbfname = arg - - gen_dts(ifname, verbose, ofname, unitname, pvrname, coreimc, threadimc) - gen_dtb(ofname, odtbfname) + ifname = "" # input file name + ofname = "" # output file name + verbose = False + coreimc = "no" # Do not print core imc by default (if no unit was explicitly specified) + threadimc = "no" # Do not print thread imc by default (if no unit was explicitly specified) + pvrname = "" + unitname = "" + odtbfname = "" # output dtb file name + + options, remainder = getopt.getopt(sys.argv[1:], 'c:d:i:p:t:u:vo:', ['coreimc=', + 'outputdtb=', + 'input=', + 'pvr=', + 'threadimc=', + 'unit=', + 'verbose', + 'output=' + ]) + + for opt, arg in options: + if opt in ('-c', '--core'): + coreimc = arg + elif opt in ('-i', '--input'): + ifname = arg + elif opt in ('-p', '--pvr'): + pvrname = arg + elif opt in ('-t', '--thread'): + threadimc = arg + elif opt in ('-u', '--unit'): + unitname = arg + elif opt in ('-v', '--verbose'): + verbose = True + elif opt in ('-o', '--output'): + ofname = arg + elif opt in ('-d', '--outputdtb'): + odtbfname = arg + + gen_dts(ifname, verbose, ofname, unitname, pvrname, coreimc, threadimc) + gen_dtb(ofname, odtbfname) |