• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)