1import sys 2import xlrd 3 4###enter file name 5#excel_filename_PWS_table=raw_input('Enter PWS excel fle:') 6#if excel_filename_PWS_table == '' : 7# print "Input Error....\n" 8# sys.exit() 9 10###Excel file handle 11# book_pws = xlrd.open_workbook(excel_filename_PWS_table) 12book_pws = xlrd.open_workbook("Maserati_power_saving_table.xls") 13#print "The number of sheets is ", book_pws.nsheets 14#print "Sheet(s) name(s):", book_pws.sheet_names() 15 16#get ver info sheet 17sheet_change_history = book_pws.sheet_by_name("Change_History") 18pws_table_version = sheet_change_history.col_values(0, 1, None) 19pws_table_date = sheet_change_history.col_values(1, 1, None) 20pws_table_version_length = len(pws_table_version)-1 21#pws_table_ver = pws_table_version[pws_table_version_length] +'_'+ pws_table_date[pws_table_version_length] 22pws_table_ver = str(pws_table_version[pws_table_version_length]) +'_'+ str(pws_table_date[pws_table_version_length]) 23print "Chage history info: " 24print pws_table_ver 25 26#get sheet info sheet 27sheet_list_info = book_pws.sheet_by_name("Sheet_Info") 28 29#get IP list 30sheet_IP_list = sheet_list_info.col_values(0, 2, None) 31sheet_IP_list_length = len(sheet_IP_list)-1 32#remove empty string in sheet_IP_list 33while sheet_IP_list_length >= 0: 34 if sheet_IP_list[sheet_IP_list_length] == "": 35 del sheet_IP_list[sheet_IP_list_length] 36 sheet_IP_list_length = sheet_IP_list_length -1 37sheet_IP_list_length = len(sheet_IP_list)-1 38print "Sheet IP list info: " 39print sheet_IP_list 40 41#get Input source list 42sheet_Input_list_useCase = sheet_list_info.col_values(1, 2, None) 43sheet_Input_list_useCase_length = len(sheet_Input_list_useCase)-1 44sheet_Input_list = sheet_list_info.col_values(2, 2, None) 45sheet_Input_list_length = len(sheet_Input_list)-1 46sheet_Input_list_ref = sheet_list_info.col_values(3, 2, None) 47sheet_Input_list_ref_length = len(sheet_Input_list_ref)-1 48#remove empty string in sheet_Input_list_useCase_length 49while sheet_Input_list_useCase_length >= 0: 50 if sheet_Input_list_useCase[sheet_Input_list_useCase_length] == "": 51 del sheet_Input_list_useCase[sheet_Input_list_useCase_length] 52 sheet_Input_list_useCase_length = sheet_Input_list_useCase_length -1 53sheet_Input_list_useCase_length = len(sheet_Input_list_useCase)-1 54#remove empty string in sheet_Input_list_length 55while sheet_Input_list_length >= 0: 56 if sheet_Input_list[sheet_Input_list_length] == "": 57 del sheet_Input_list[sheet_Input_list_length] 58 sheet_Input_list_length = sheet_Input_list_length -1 59sheet_Input_list_length = len(sheet_Input_list)-1 60#remove empty string in sheet_Input_list_ref_length 61while sheet_Input_list_ref_length >= 0: 62 if sheet_Input_list_ref[sheet_Input_list_ref_length] == "": 63 del sheet_Input_list_ref[sheet_Input_list_ref_length] 64 sheet_Input_list_ref_length = sheet_Input_list_ref_length -1 65sheet_Input_list_ref_length = len(sheet_Input_list_ref)-1 66#print "Sheet Input list info: " 67#print sheet_Input_list 68#print "Sheet input list length:" 69#print sheet_Input_list_length 70#print "sheet_Input_list_useCase ", sheet_Input_list_useCase 71#set Input source list ref directory type 72input_source_ref = {} 73input_source_ref_offset = 0 74while sheet_Input_list_ref_length >= 0: 75 input_source_ref[sheet_Input_list_ref[sheet_Input_list_ref_length]] = input_source_ref_offset 76 input_source_ref_offset = input_source_ref_offset + 1 77 sheet_Input_list_ref_length = sheet_Input_list_ref_length - 1 78sheet_Input_list_ref_length = len(sheet_Input_list_ref)-1 79#print "Sheet Input list info ref:", sheet_Input_list_ref 80#print input_source_ref 81#set Input source list directory type 82input_source_list = {} 83while sheet_Input_list_length >= 0: 84 input_source_list[sheet_Input_list_useCase[sheet_Input_list_length]] = sheet_Input_list[sheet_Input_list_length] 85 sheet_Input_list_length = sheet_Input_list_length - 1 86sheet_Input_list_length = len(sheet_Input_list)-1 87#print "input_source_list dir ", input_source_list 88###text file handle 89#open file (pws_setting_info_table.h) 90pws_table_file = open('mhal_pws_setting_info_table.h','w') 91pws_table_file.write('#ifndef _PWS_SETTING_INFO_TABLE_H_\n') 92pws_table_file.write('#define _PWS_SETTING_INFO_TABLE_H_\n\n') 93pws_table_file.write('#include \"MsTypes.h\"\n\n') 94 95#write pws data structure 96pws_table_file.write('typedef struct {\n') 97pws_table_file.write(' MS_U32 u32RegAddr;\n') 98pws_table_file.write(' MS_U8 u8RegMask;\n') 99pws_table_file.write(' /*MS_U16 u16OffOnFlag;*/\n') 100pws_table_file.write(' MS_BOOL bInvert;\n') 101pws_table_file.write(' const char regName[32];//*regName;\n') 102pws_table_file.write('}PWS_TABLE_INFO;\n\n') 103 104#write pws table info 105pws_table_file.write('static const PWS_TABLE_INFO pws_setting_info_table[] =\n') 106pws_table_file.write('{\n') 107PWS_Items = 0 #total pws items 108offOnBitmap_for_pws_table = [] #for pws table use include in api layer 109regName_for_pws_table = [] #for pws table use include in api layer 110offOnBitmap_regName_for_pws_table_index = 0 111 112pws_init_table_IP_RegName = [] #for pws init table use that all OFF or ON 113pws_init_table_IP_Address = [] #for pws init table use that all OFF or ON 114pws_init_table_IP_Mask = [] #for pws init table use that all OFF or ON 115pws_init_table_IP_Invert = [] #for pws init table use that all OFF or ON 116pws_init_table_offOnBitmap = [] #for pws init table use that all OFF or ON 117pws_init_regName_for_pws_table_index = 0 118 119for x in sheet_IP_list: 120 sheet_IP = book_pws.sheet_by_name(x) 121 sheet_IP_Valid = sheet_IP.col_values(5, 2, None) 122 sheet_IP_Invert = sheet_IP.col_values(4, 2, None) 123 sheet_IP_RegName = sheet_IP.col_values(1, 2, None) 124 sheet_IP_Address = sheet_IP.col_values(2, 2, None) 125 sheet_IP_Mask = sheet_IP.col_values(3, 2, None) 126 #for getting offOn flag, init value 127 offOnBitmap = [] #OffOnFlag use 128 offOnFlag_length = 0 129 #offOnFlag_value = 0x0000 130 sheet_IP_RegName_length = len(sheet_IP_RegName) -1 #zero-based 131 132###to be finished 133 #print "sheet_IP_list_length :", sheet_IP_list_length, "!!!" 134 #print "sheet_Input_list_useCase_length :", sheet_Input_list_useCase_length 135 ###sheet_IP_OffOnFlag_inputSource = sheet_IP.row_values(1, 6, (6+(sheet_IP_list_length+1))) #need modify 136 sheet_IP_OffOnFlag_inputSource = sheet_IP.row_values(1, 6, (6+(sheet_Input_list_useCase_length+1))) #need modify 137 #print "sheet_IP_OffOnFlag_inputSource ", sheet_IP_OffOnFlag_inputSource 138 139 while offOnFlag_length <= sheet_IP_RegName_length : 140 ###sheet_IP_OffOnFlag = sheet_IP.row_values((2+offOnFlag_length), 6, (6+(sheet_IP_list_length+1))) #need modify 141 sheet_IP_OffOnFlag = sheet_IP.row_values((2+offOnFlag_length), 6, (6+(sheet_Input_list_useCase_length+1))) #need modify 142 143 offOnBitmap_all_OFF_or_ON = [] #for calculate if all source is OFF or ON 144 145 #print "sheet_IP_OffOnFlag ", sheet_IP_OffOnFlag, "IP list name", x 146 #print "offOnFlag_length :",offOnFlag_length 147 input_offOnFlag_length = 0 148 #input_offOnFlag_shift_offset = sheet_Input_list_length 149 #print "get input_source_ref dir value :", input_source_ref['CVBS'] 150### if sheet_IP_Invert[offOnFlag_length] == "N" : 151 offOnFlag_value = 0x0000 #off = 0x01, on = 0x00 152 153### else : 154### offOnFlag_value = 0xFFFF #off = 0x00, on = 0x01 155 156 #print "input_offOnFlag_length >>>", input_offOnFlag_length, "sheet_Input_list_length>>>", sheet_Input_list_length 157 158 while input_offOnFlag_length <= sheet_Input_list_length: 159 input_offOnFlag_shift_offset = input_source_ref[input_source_list[sheet_IP_OffOnFlag_inputSource[input_offOnFlag_length]]] 160 #print "input_offOnFlag_shift_offset ", input_offOnFlag_shift_offset 161 #print "input_source_ref ", input_source_ref 162 #print "input_source_list ", input_source_list[sheet_IP_OffOnFlag_inputSource[input_offOnFlag_length]] 163### if sheet_IP_Invert[offOnFlag_length] == "N" : #off = 0x01, on = 0x00 164### #print "No invert" 165 if sheet_IP_OffOnFlag[input_offOnFlag_length] == "ON" :#need modify 166 offOnBitmap_all_OFF_or_ON.insert(input_offOnFlag_length, 0x00) ###ON 167 #offOnFlag_value = offOnFlag_value & ~(0x01 << input_offOnFlag_length) 168 offOnFlag_value = offOnFlag_value & ~(0x01 << input_offOnFlag_shift_offset) 169 else : #need modify 170 offOnBitmap_all_OFF_or_ON.insert(input_offOnFlag_length, 0x01) ###OFF 171 #offOnFlag_value = offOnFlag_value | (0x01 << input_offOnFlag_length) 172 offOnFlag_value = offOnFlag_value | (0x01 << input_offOnFlag_shift_offset) 173### else : #off = 0x00, on = 0x01 174### #print "Yes invert, " 175### if sheet_IP_OffOnFlag[input_offOnFlag_length] == "ON" :#need modify 176### offOnBitmap_all_OFF_or_ON.insert(input_offOnFlag_length, 0x01) ###OFF 177### #offOnFlag_value = offOnFlag_value | (0x01 << input_offOnFlag_length) 178### offOnFlag_value = offOnFlag_value | (0x01 << input_offOnFlag_shift_offset) 179### #print offOnFlag_value 180### else : #need modify 181### offOnBitmap_all_OFF_or_ON.insert(input_offOnFlag_length, 0x00) ###OFF 182### #offOnFlag_value = offOnFlag_value & ~(0x01 << input_offOnFlag_length) 183### offOnFlag_value = offOnFlag_value & ~(0x01 << input_offOnFlag_shift_offset) 184### #print offOnFlag_value 185 #input_offOnFlag_shift_offset = input_offOnFlag_shift_offset - 1 186 input_offOnFlag_length = input_offOnFlag_length + 1 187 188 #print "sheet_IP_RegName>>>",sheet_IP_RegName[sheet_IP_RegName_length] ,", offOnBitmap_all_OFF_or_ON >>>>>>", offOnBitmap_all_OFF_or_ON 189 offOnBitmap_all_OFF_or_ON_length = len(offOnBitmap_all_OFF_or_ON) - 1 190 #print "offOnBitmap_all_OFF_or_ON_length >>>", offOnBitmap_all_OFF_or_ON_length 191 offOnBitmap_all_OFF_or_ON_length_index = 0 192 #print "offOnBitmap_all_OFF_or_ON_length_index>>", offOnBitmap_all_OFF_or_ON_length_index 193 ###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 194 #while offOnBitmap_all_OFF_or_ON_length_index <= offOnBitmap_all_OFF_or_ON_length: 195 # print "offOnBitmap_all_OFF_or_ON_length_index===>", offOnBitmap_all_OFF_or_ON_length_index, ", offOnBitmap_all_OFF_or_ON_length>>", offOnBitmap_all_OFF_or_ON_length 196 # print "offOnBitmap_all_OFF_or_ON[", offOnBitmap_all_OFF_or_ON_length_index ,"] >>> ", offOnBitmap_all_OFF_or_ON[offOnBitmap_all_OFF_or_ON_length_index] 197 # offOnBitmap_all_OFF_or_ON_length_index = offOnBitmap_all_OFF_or_ON_length_index + 1 198 ###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 199 #print "offOnBitmap_all_OFF_or_ON =====>>>>", offOnBitmap_all_OFF_or_ON 200 offOnBitmap_all_OFF_or_ON_length_index = 0 201 offOnBitmap_all_OFF_or_ON_length_index_next = 1 202 isAll_Off_or_on = 1 #if all flag is off or on, 203 while offOnBitmap_all_OFF_or_ON_length_index <= offOnBitmap_all_OFF_or_ON_length: 204 if offOnBitmap_all_OFF_or_ON_length_index_next > offOnBitmap_all_OFF_or_ON_length: 205 #print "break >>>" 206 break 207 if offOnBitmap_all_OFF_or_ON[offOnBitmap_all_OFF_or_ON_length_index] != offOnBitmap_all_OFF_or_ON[offOnBitmap_all_OFF_or_ON_length_index_next]: 208 isAll_Off_or_on = 0 209 #print "isAll_Off_or_on >>>", isAll_Off_or_on 210 offOnBitmap_all_OFF_or_ON_length_index = offOnBitmap_all_OFF_or_ON_length_index + 1 211 offOnBitmap_all_OFF_or_ON_length_index_next = offOnBitmap_all_OFF_or_ON_length_index_next + 1 212##### 213 if sheet_IP_Invert[offOnFlag_length] == "N" and isAll_Off_or_on==1: #no invert andd all off or on 214 if offOnBitmap_all_OFF_or_ON[0] == 0: # means ON 215 offOnFlag_value = 0x0000 216 else: 217 offOnFlag_value = 0xFFFF #means off 218 if sheet_IP_Invert[offOnFlag_length] == "Y" and isAll_Off_or_on==1: 219 if offOnBitmap_all_OFF_or_ON[0] == 1: # means ON 220 offOnFlag_value = 0xFFFF 221 else: 222 offOnFlag_value = 0x0000 #means off 223##### 224 #print "offOnFlag_value.....>>>>", offOnFlag_value 225 226 offOnFlag_hex_value='0x%04X' % (offOnFlag_value) 227 228 offOnBitmap.insert(offOnFlag_length, offOnFlag_hex_value) 229 offOnFlag_length = offOnFlag_length + 1 230 #offOnFlag_value = 0x0000 231 #print "offOnFlag_hex_value is ",offOnBitmap 232 233###to be finished 234 #remove valid = N in sheet_IP 235 sheet_IP_Valid_length = len(sheet_IP_Valid)-1 236 while sheet_IP_Valid_length >= 0: 237 if sheet_IP_Valid[sheet_IP_Valid_length] == "N": 238 del sheet_IP_RegName[sheet_IP_Valid_length] 239 del sheet_IP_Address[sheet_IP_Valid_length] 240 del sheet_IP_Mask[sheet_IP_Valid_length] 241 del sheet_IP_Invert[sheet_IP_Valid_length] 242 del offOnBitmap[sheet_IP_Valid_length] 243 sheet_IP_Valid_length = sheet_IP_Valid_length -1 244 #print "offOnBitmap again :",offOnBitmap 245 246 #record offOnBitmap that are all OFF or ON value 247 sheet_IP_All_off_on_length = len(offOnBitmap)-1 248 #print "sheet_IP_All_off_on_length: ", sheet_IP_All_off_on_length 249 sheet_IP_All_off_on_counter = 0 250 #while sheet_IP_All_off_on_length >= 0: 251 while sheet_IP_All_off_on_counter <= sheet_IP_All_off_on_length: 252 #print "offOnBitmap[] : ",offOnBitmap[sheet_IP_All_off_on_counter], "sheet_IP_All_off_on_counter :", sheet_IP_All_off_on_counter 253 if offOnBitmap[sheet_IP_All_off_on_counter] == "0xFFFF" or offOnBitmap[sheet_IP_All_off_on_counter] == "0x0000": 254 #print "sheet_IP_All_off_on_counter in while :", sheet_IP_All_off_on_counter, "pws_init_regName_for_pws_table_index:", pws_init_regName_for_pws_table_index 255 #print "sheet_IP_RegName[] :", sheet_IP_RegName 256 pws_init_table_IP_RegName.insert(pws_init_regName_for_pws_table_index,sheet_IP_RegName[sheet_IP_All_off_on_counter]) 257 pws_init_table_IP_Address.insert(pws_init_regName_for_pws_table_index,sheet_IP_Address[sheet_IP_All_off_on_counter]) 258 pws_init_table_IP_Mask.insert(pws_init_regName_for_pws_table_index,sheet_IP_Mask[sheet_IP_All_off_on_counter]) 259 pws_init_table_IP_Invert.insert(pws_init_regName_for_pws_table_index,sheet_IP_Invert[sheet_IP_All_off_on_counter]) 260 pws_init_table_offOnBitmap.insert(pws_init_regName_for_pws_table_index,offOnBitmap[sheet_IP_All_off_on_counter]) 261 262 pws_init_regName_for_pws_table_index = pws_init_regName_for_pws_table_index + 1 263 264 #print "all off or on" 265 #else : 266 # print "normal" 267 268 sheet_IP_All_off_on_counter = sheet_IP_All_off_on_counter + 1 269 #print "pws_init_table_IP_RegName: ", pws_init_table_IP_RegName 270 271 #remove all OFF or ON 272 sheet_IP_RegName_length = len(sheet_IP_RegName)-1 273 while sheet_IP_RegName_length >= 0: 274 #print "offOnBitmap >>>>>>>", offOnBitmap, ", sheet_IP_RegName_length>>", sheet_IP_RegName_length 275 if offOnBitmap[sheet_IP_RegName_length] == "0x0000" or offOnBitmap[sheet_IP_RegName_length] == "0xFFFF": 276 del sheet_IP_RegName[sheet_IP_RegName_length] 277 del sheet_IP_Address[sheet_IP_RegName_length] 278 del sheet_IP_Mask[sheet_IP_RegName_length] 279 del sheet_IP_Invert[sheet_IP_RegName_length] 280 del offOnBitmap[sheet_IP_RegName_length] 281 sheet_IP_RegName_length = sheet_IP_RegName_length -1 282 #print "offOnBitmap again >>",offOnBitmap 283 284 #add comment show Block name 285 pws_table_file.write(' //'+ x + '\n') 286 287 sheet_IP_RegName_length = len(sheet_IP_RegName) -1 288 sheet_IP_index = 0 289 while sheet_IP_index <= sheet_IP_RegName_length: 290 #write PWS info to file {"regname", address, mask} 291 #pws_table_file.write(' {\"' + sheet_IP_RegName[sheet_IP_index]+ '\", ' + sheet_IP_Address[sheet_IP_index] + ', '+ sheet_IP_Mask[sheet_IP_index] + ', '+ offOnBitmap[sheet_IP_index] + '}\n') 292 if sheet_IP_Invert[sheet_IP_index] == "N" : 293 pws_table_file.write(' {' + sheet_IP_Address[sheet_IP_index] + ', '+ sheet_IP_Mask[sheet_IP_index] + '/*, '+ offOnBitmap[sheet_IP_index] + '*/ /*off=0x01, on=0x00*/, ' + "FALSE" + ', \"' + sheet_IP_RegName[sheet_IP_index]+ '\"},\n') 294 else : 295 pws_table_file.write(' {' + sheet_IP_Address[sheet_IP_index] + ', '+ sheet_IP_Mask[sheet_IP_index] + '/*, '+ offOnBitmap[sheet_IP_index] + '*/ /*off=0x00, on=0x01*/, ' + "TRUE" + ', \"' + sheet_IP_RegName[sheet_IP_index]+ '\"},\n') 296 #for pws table use include in api layer 297 offOnBitmap_for_pws_table.insert(offOnBitmap_regName_for_pws_table_index, offOnBitmap[sheet_IP_index]) 298 regName_for_pws_table.insert(offOnBitmap_regName_for_pws_table_index, sheet_IP_RegName[sheet_IP_index]) 299 offOnBitmap_regName_for_pws_table_index = offOnBitmap_regName_for_pws_table_index + 1 300 sheet_IP_index = sheet_IP_index +1 301 #print "offOnBitmap_for_pws_table", offOnBitmap_for_pws_table 302 #print "regName_for_pws_table",regName_for_pws_table 303 PWS_Items = PWS_Items + len(sheet_IP_RegName) #1-based 304 305pws_table_file.write('};\n\n') 306 307#write pws init data structure 308pws_table_file.write('static const PWS_TABLE_INFO pws_init_setting_info_table[] =\n') 309pws_table_file.write('{\n') 310flag_index = 0 311PWS_init_Items = len(pws_init_table_IP_RegName) 312#print "pws init setting info table PWS_init_Items: ", PWS_init_Items 313while flag_index <= (PWS_init_Items-1): 314 if pws_init_table_IP_Invert[flag_index] == "N" : 315 pws_table_file.write(' {' + pws_init_table_IP_Address[flag_index] + ', '+ pws_init_table_IP_Mask[flag_index] + '/*, '+ pws_init_table_offOnBitmap[flag_index] + '*/ /*off=0x01, on=0x00*/, ' + "FALSE" + ', \"' + pws_init_table_IP_RegName[flag_index]+ '\"},\n') 316 else : 317 pws_table_file.write(' {' + pws_init_table_IP_Address[flag_index] + ', '+ pws_init_table_IP_Mask[flag_index] + '/*, '+ pws_init_table_offOnBitmap[flag_index] + '*/ /*off=0x00, on=0x01*/, ' + "TRUE" + ', \"' + pws_init_table_IP_RegName[flag_index]+ '\"},\n') 318 flag_index = flag_index + 1 319pws_table_file.write('};\n\n') 320 321#pws_table_file.write('#define PWS_First_Items 0\n') 322#pws_table_file.write('#define OutOfRange_PWS_Items ' + str(PWS_Items) + '\n') 323 324#do while loop for every IP list 325pws_table_file.write('\n#endif\n') 326#close file 327#open file (pws_table.h) 328pws_table_file = open('mhal_pws_table.h','w') 329pws_table_file.write('#ifndef _PWSTABLE_H_\n') 330pws_table_file.write('#define _PWSTABLE_H_\n\n') 331 332pws_table_file.write('#define PWS_TBL_VERSION \"' + pws_table_ver + '\"\n') 333pws_table_file.write('#define PWS_First_Items 0\n') 334pws_table_file.write('#define OutOfRange_PWS_Items ' + str(PWS_Items) + '\n\n') 335 336#write pws data structure 337pws_table_file.write('static const MS_U16 pws_table[] =\n') 338pws_table_file.write('{\n') 339flag_index = 0 340while flag_index <= (PWS_Items-1): 341 pws_table_file.write(' ' + offOnBitmap_for_pws_table[flag_index] + ', /*'+ regName_for_pws_table[flag_index] + '*/\n') 342 flag_index = flag_index + 1 343pws_table_file.write('};\n\n') 344 345#write pws init data structure 346 347pws_table_file.write('#define PWS_Init_First_Items 0\n') 348pws_table_file.write('#define OutOfRange_PWS_Init_Items ' + str(len(pws_init_table_IP_RegName)) + '\n\n') 349 350pws_table_file.write('static const MS_U16 pws_init_table[] =\n') 351pws_table_file.write('{\n') 352flag_index = 0 353PWS_init_Items = len(pws_init_table_IP_RegName) 354#print "PWS_init_Items: ", PWS_init_Items 355while flag_index <= (PWS_init_Items-1): 356 pws_table_file.write(' ' + pws_init_table_offOnBitmap[flag_index] + ', /*'+ pws_init_table_IP_RegName[flag_index] + '*/\n') 357 flag_index = flag_index + 1 358pws_table_file.write('};\n\n') 359 360pws_table_file.write('\n#endif\n') 361#print "offOnBitmap_for_pws_table", len(offOnBitmap_for_pws_table) 362#print "regName_for_pws_table", len(regName_for_pws_table) 363print "Table generating OK...!!!" 364