1#!/usr/bin/env python3 2# coding=utf-8 3 4#=============================================================================== 5# @brief create database 6# Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 7# Licensed under the Apache License, Version 2.0 (the "License"); 8# you may not use this file except in compliance with the License. 9# You may obtain a copy of the License at 10# 11# http://www.apache.org/licenses/LICENSE-2.0 12# 13# Unless required by applicable law or agreed to in writing, software 14# distributed under the License is distributed on an "AS IS" BASIS, 15# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16# See the License for the specific language governing permissions and 17# limitations under the License. 18#=============================================================================== 19 20import xml.dom.minidom 21import sys 22import re 23import os 24import shutil 25import xml.etree.ElementTree as ET 26 27def write_enum_struct(name, enums, file): 28 file.write('typedef enum {\r\n') 29 for enum in enums: 30 file.write(''.join([' ', enum.getAttribute('Name'), '=', enum.getAttribute('Value'), ',\r\n'])) 31 file.write(''.join(['} ', name, ';\r\n'])) 32 33def write_nomal_struct(name, fields, file): 34 file.write('typedef struct {\r\n') 35 for field in fields: 36 if field.nodeType != xml.dom.Node.ELEMENT_NODE: 37 continue 38 if field.getAttribute('Enum') == '': 39 if field.getAttribute('Length') == '1': 40 file.write(''.join([' ', field.getAttribute('Type'), ' ', field.getAttribute('FieldName'), ';\r\n'])) 41 else: 42 file.write(''.join([' ', field.getAttribute('Type'), ' ', field.getAttribute('FieldName'), '[', field.getAttribute('Length') , '];\r\n'])) 43 else: 44 if field.getAttribute('Length') == '1': 45 file.write(''.join([' ', field.getAttribute('Enum'), ' ', field.getAttribute('FieldName'), ';\r\n'])) 46 else: 47 file.write(''.join([' ', field.getAttribute('Enum'), ' ', field.getAttribute('FieldName'), '[', field.getAttribute('Length'), '];\r\n'])) 48 file.write(''.join(['} ', name, ';\r\n'])) 49 50def write_union(item, file): 51 file.write('typedef union {\r\n') 52 fields = item.getElementsByTagName("Field") 53 for field in fields: 54 file.write(''.join([' ', field.getAttribute('Type'), ' ', field.getAttribute('FieldName'), ';\r\n'])) 55 file.write(''.join(['} ', item.getAttribute('Type'), ';\r\n'])) 56def find_union(fields, union_name_to_node): 57 for field in fields: 58 if field.getAttribute('FieldType') == 'union': 59 union_name_to_node[field.getAttribute('Type')] = field 60def write_msg_struct(name, fields, file): 61 file.write('typedef struct {\r\n') 62 for field in fields: 63 if field.nodeType != xml.dom.Node.ELEMENT_NODE: 64 continue 65 if field.getAttribute('Enum') == '': 66 if field.getAttribute('Length') == '1': 67 file.write(''.join([' ', field.getAttribute('Type'), ' ', field.getAttribute('FieldName'), ';\r\n'])) 68 else: 69 file.write(''.join([' ', field.getAttribute('Type'), ' ', field.getAttribute('FieldName'), '[', field.getAttribute('Length'), '];\r\n'])) 70 else: 71 if field.getAttribute('Length') == '1': 72 file.write(''.join([' ', field.getAttribute('Enum'), ' ', field.getAttribute('FieldName'), ';\r\n'])) 73 else: 74 file.write(''.join([' ' , field.getAttribute('Enum'), ' ', field.getAttribute('FieldName'), '[', field.getAttribute('Length'), '];\r\n'])) 75 76 file.write(''.join(['} ', name, '_STRU;\r\n'])) 77 78def int_prim_xml_air_tree(tree): 79 root = tree.getroot() 80 layer_root_element = ET.Element('') 81 for child_1 in root: 82 if child_1.tag=='SUBSYSTEM': 83 for child_2 in child_1: 84 if child_2.tag=='AIR_LOG': 85 layer_root_element = child_2 86 break 87 break 88 89 if layer_root_element.tag=='AIR_LOG': 90 temp_attrib=layer_root_element.attrib 91 temp_text=layer_root_element.text 92 temp_tail = layer_root_element.tail 93 #layer_root_element.clear() 94 layer_root_element.attrib = temp_attrib 95 layer_root_element.text = temp_text 96 layer_root_element.tail = temp_tail 97 return layer_root_element 98 99def int_prim_xml_layer_tree(tree): 100 root = tree.getroot() 101 layer_root_element = ET.Element('') 102 for child_1 in root: 103 if child_1.tag=='SUBSYSTEM': 104 for child_2 in child_1: 105 if child_2.tag=='LAYER_LOG': 106 layer_root_element = child_2 107 break 108 break 109 110 if layer_root_element.tag=='LAYER_LOG': 111 temp_attrib=layer_root_element.attrib 112 temp_text=layer_root_element.text 113 temp_tail = layer_root_element.tail 114 #layer_root_element.clear() 115 layer_root_element.attrib = temp_attrib 116 layer_root_element.text = temp_text 117 layer_root_element.tail = temp_tail 118 return layer_root_element 119 120def int_prim_xml_msg_tree(tree): 121 root = tree.getroot() 122 layer_root_element = ET.Element('') 123 for child_1 in root: 124 if child_1.tag=='SUBSYSTEM': 125 for child_2 in child_1: 126 if child_2.tag=='MSG_LOG': 127 layer_root_element = child_2 128 break 129 break 130 131 if layer_root_element.tag=='MSG_LOG': 132 temp_attrib=layer_root_element.attrib 133 temp_text=layer_root_element.text 134 temp_tail = layer_root_element.tail 135 #layer_root_element.clear() 136 layer_root_element.attrib = temp_attrib 137 layer_root_element.text = temp_text 138 layer_root_element.tail = temp_tail 139 return layer_root_element 140 141def add_element_to_xml(root_element): 142 global num_to_id 143 sorted_list=sorted(num_to_id.items(),key=lambda e:e[1]) 144 145 for key,value in sorted_list: 146 #print('key2=',key, 'value=',value) 147 new_element=ET.Element('') 148 new_element.tag='MSG' 149 new_element.attrib['NAME']=key 150 new_element.attrib['ID']=value 151 new_element.attrib['DESCRIPTION']='' 152 new_element.attrib['STRUCTURE']=''.join([key, '_STRU']) 153 new_element.tail='\n\t\t\t' 154 root_element.append(new_element) 155def write_prim_xml_tree(tree, dest): 156 dst_xml_dir = os.path.dirname(dest) 157 if not os.path.exists(dst_xml_dir): 158 os.makedirs(dst_xml_dir) 159# print(g_params['PRIM_XML_DST_XML_FILE'].strip()) 160 tree.write(dest,encoding="UTF-8",xml_declaration = '<?xml version="1.0" encoding="utf-8" ?>',method="xml") 161 162try: 163 msg_xml, mss_prim_db, destination = sys.argv[1:] 164except ValueError: 165 raise SystemExit("Usage: %s msg_xml mss_prim_db destination" % sys.argv[0]) 166 167msg_struct_def = os.path.join(destination, 'cco', 'system', 'diag', 'msg_struct_def.txt') 168extern_datatype_def = os.path.join(destination, 'cco','system', 'diag', 'extern_datatype_def.txt') 169mss_prim_db_new = os.path.join(destination, 'cco', 'system', 'hdbcfg', 'mss_prim_db.xml') 170 171src_database_dir = os.path.join(os.path.dirname(sys.argv[0]), "database") 172 173shutil.rmtree(destination, ignore_errors=True, onerror=None) 174shutil.copytree(src_database_dir, destination) 175 176dom_tree = xml.dom.minidom.parse(msg_xml) 177collection = dom_tree.documentElement 178enum_fields = collection.getElementsByTagName("EnumsEntry") 179struct_fields = collection.getElementsByTagName("Structure") 180msg_fields = collection.getElementsByTagName("Message") 181all_fields = collection.getElementsByTagName("Field") 182 183num_to_id={} 184enum_to_size = {} 185type_to_size = {} 186union_name_to_node = {} 187lp_struct_to_size = {} 188 189for item in msg_fields: 190 message_id = item.getAttribute('MessageID') 191 name = item.getAttribute('Name') 192 num_to_id[name] = message_id 193 194with open(msg_struct_def,'w') as f: 195 f.write('#include \"base_datatype_def.txt\"\r\n') 196 f.write('#include \"extern_datatype_def.txt\"\r\n') 197 198 for item in enum_fields: 199 name = item.getElementsByTagName("Name")[0].childNodes[0].data 200 enums = item.getElementsByTagName('Enum') 201 write_enum_struct(name, enums, f) 202 203 for item in struct_fields: 204 name = item.getAttribute('Type') 205 fields = item.getElementsByTagName('Field') 206 write_nomal_struct(name, item.childNodes, f) 207 208 find_union(all_fields, union_name_to_node) 209 for key, value in union_name_to_node.items(): 210 write_union(value, f) 211 for item in msg_fields: 212 name = item.getAttribute('Name') 213 fields = item.getElementsByTagName('Field') 214 write_msg_struct(name, item.childNodes, f) 215 f.close() 216 217with open(extern_datatype_def,'w') as f: 218 for field in all_fields: 219 enum = field.getAttribute('Enum') 220 if enum == '': 221 continue 222 size = field.getAttribute('Size') 223 enum_to_size[enum] = size 224 for item in enum_to_size.items(): 225 if item[1] == '1': 226 line = ''.join([item[0], ' 8 0\r\n']) 227 elif item[1] == '2': 228 line = ''.join([item[0], ' 16 0\r\n']) 229 elif item[1] == '4': 230 line = ''.join([item[0], ' 32 0\r\n']) 231 else: 232 continue 233 f.write(line) 234 for field in all_fields: 235 lp_struct = field.getAttribute('Type') 236 if 'LP_' not in lp_struct: 237 continue 238 size = field.getAttribute('Size') 239 lp_struct_to_size[lp_struct] = size 240 for item in lp_struct_to_size.items(): 241 if item[1] == '1': 242 line = ''.join([item[0], ' 8 0\r\n']) 243 elif item[1] == '2': 244 line = ''.join([item[0], ' 16 0\r\n']) 245 elif item[1] == '4': 246 line = ''.join([item[0], ' 32 0\r\n']) 247 else: 248 continue 249 f.write(line) 250 f.close() 251 252 253tree = ET.parse(mss_prim_db) 254add_element_to_xml(int_prim_xml_msg_tree(tree)) 255write_prim_xml_tree(tree, mss_prim_db_new)