summaryrefslogtreecommitdiff
path: root/utils/imxtools/regtools/hwemulgen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/imxtools/regtools/hwemulgen.cpp')
-rw-r--r--utils/imxtools/regtools/hwemulgen.cpp387
1 files changed, 0 insertions, 387 deletions
diff --git a/utils/imxtools/regtools/hwemulgen.cpp b/utils/imxtools/regtools/hwemulgen.cpp
deleted file mode 100644
index ae8b9dbec5..0000000000
--- a/utils/imxtools/regtools/hwemulgen.cpp
+++ /dev/null
@@ -1,387 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 by Amaury Pouly
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "desc_parser.hpp"
22#include <stdio.h>
23#include <stdlib.h>
24#include <algorithm>
25#include <map>
26
27#define error(...) do{ fprintf(stderr, __VA_ARGS__); exit(1); } while(0)
28
29int g_soc_count;
30int g_reg_count;
31int g_field_count;
32
33namespace {
34
35std::string tolower(const std::string s)
36{
37 std::string res = s;
38 std::transform(res.begin(), res.end(), res.begin(), ::tolower);
39 return res;
40}
41
42std::string toupper(const std::string& s)
43{
44 std::string res = s;
45 std::transform(res.begin(), res.end(), res.begin(), ::toupper);
46 return res;
47}
48
49bool lex_comp(const std::string& a, const std::string& b)
50{
51 return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end());
52}
53
54}
55
56void fprint_copyright(FILE *f)
57{
58 fprintf(f,"\
59/***************************************************************************\n\
60 * __________ __ ___.\n\
61 * Open \\______ \\ ____ ____ | | _\\_ |__ _______ ___\n\
62 * Source | _// _ \\_/ ___\\| |/ /| __ \\ / _ \\ \\/ /\n\
63 * Jukebox | | ( <_> ) \\___| < | \\_\\ ( <_> > < <\n\
64 * Firmware |____|_ /\\____/ \\___ >__|_ \\|___ /\\____/__/\\_ \\\n\
65 * \\/ \\/ \\/ \\/ \\/\n\
66 * This file was automatically generated by hwemulgen, DO NOT EDIT it.\n\
67 *\n\
68 * Copyright (C) 2012 by Amaury Pouly\n\
69 *\n\
70 * This program is free software; you can redistribute it and/or\n\
71 * modify it under the terms of the GNU General Public License\n\
72 * as published by the Free Software Foundation; either version 2\n\
73 * of the License, or (at your option) any later version.\n\
74 *\n\
75 * This software is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY\n\
76 * KIND, either express or implied.\n\
77 *\n\
78 ****************************************************************************/\n");
79}
80
81void gen_header(const std::string& filename)
82{
83 FILE *f = fopen(filename.c_str(), "w");
84 if(f == NULL)
85 error("Cannot open file %s\n", filename.c_str());
86 fprint_copyright(f);
87 fprintf(f, "#ifndef __HWEMUL_SOC_HEADER__\n");
88 fprintf(f, "#define __HWEMUL_SOC_HEADER__\n");
89 fprintf(f, "\n");
90 fprintf(f, "#include \"stddef.h\"\n");
91 fprintf(f, "#include \"stdint.h\"\n");
92
93 fprintf(f, "\n\
94#define HWEMUL_SOC_REG_HAS_SCT (1 << 0)\n\
95\n\
96struct hwemul_soc_reg_field_t\n\
97{\n\
98 const char *name;\n\
99 unsigned short first_bit, last_bit;\n\
100};\n\
101\n\
102struct hwemul_soc_reg_t\n\
103{\n\
104 const char *name;\n\
105 uint32_t addr;\n\
106 uint32_t flags;\n\
107 size_t nr_fields;\n\
108 struct hwemul_soc_reg_field_t *fields_by_name[]; /* ordered by lexicographic order */\n\
109};\n\
110\n\
111struct hwemul_soc_t\n\
112{\n\
113 const char *name;\n\
114 size_t nr_regs;\n\
115 struct hwemul_soc_reg_t *regs_by_name[]; /* ordered by lexicographic order */\n\
116};\n\
117\n\
118struct hwemul_soc_list_t\n\
119{\n\
120 size_t nr_socs;\n\
121 struct hwemul_soc_t *socs[];\n\
122};\n\
123\n\
124struct hwemul_soc_list_t *hwemul_get_soc_list(void);\n\
125\n");
126
127 fprintf(f, "#endif\n");
128 fclose(f);
129}
130
131std::string extract_last_part(std::string s)
132{
133 size_t pos = s.find_last_of("/\\");
134 if(pos != std::string::npos)
135 s = s.substr(pos + 1);
136 pos = s.find_last_of(".");
137 if(pos != std::string::npos)
138 s = s.substr(0, pos);
139 return s;
140}
141
142std::vector< std::string > gen_fields(FILE *f, std::string prefix,
143 const std::vector< soc_reg_field_t >& fields)
144{
145 std::vector< std::string > list;
146
147 for(size_t i = 0; i < fields.size(); i++)
148 {
149 g_field_count++;
150 std::string var_name = prefix + tolower(fields[i].name);
151 list.push_back(var_name);
152
153 fprintf(f, "\
154static struct hwemul_soc_reg_field_t %s =\n\
155{\n\
156 \"%s\",\n\
157 %d, %d\n\
158};\n\
159\n", var_name.c_str(), fields[i].name.c_str(), fields[i].first_bit, fields[i].last_bit);
160 }
161
162 return list;
163}
164
165std::vector< std::string > gen_common_regs(FILE *f, std::string prefix, std::string devname,
166 soc_addr_t devaddr, const std::vector< soc_reg_t >& regs,
167 const std::vector< soc_multireg_t >& multiregs)
168{
169 std::vector< std::string > list;
170
171 for(size_t i = 0; i < regs.size(); i++)
172 {
173 g_reg_count++;
174 std::string var_name = prefix + tolower(regs[i].name);
175
176 list.push_back(var_name);
177
178 std::vector< std::string > field_vars = gen_fields(f, var_name + "_",
179 regs[i].fields);
180
181 std::sort(field_vars.begin(), field_vars.end(), lex_comp);
182
183 fprintf(f, "\
184static struct hwemul_soc_reg_t %s =\n\
185{\n\
186 \"HW_%s_%s\",\n\
187 %#x,\n\
188 0", var_name.c_str(), devname.c_str(), regs[i].name.c_str(), devaddr + regs[i].addr);
189 if(regs[i].flags & REG_HAS_SCT)
190 fprintf(f, " | HWEMUL_SOC_REG_HAS_SCT");
191 fprintf(f, ",\n");
192 fprintf(f, "\
193 %u,\n\
194 {", (unsigned)field_vars.size());
195 if(field_vars.size() != 0)
196 fprintf(f, "\n");
197 for(size_t j = 0; j < field_vars.size(); j++)
198 fprintf(f, " &%s,\n", field_vars[j].c_str());
199 if(field_vars.size() != 0)
200 fprintf(f, " ");
201 fprintf(f,"\
202}\n};\n\
203\n");
204 }
205
206 for(size_t i = 0; i < multiregs.size(); i++)
207 {
208 g_reg_count++;
209 std::vector< std::string > field_vars = gen_fields(f,
210 prefix + tolower(multiregs[i].name) + "_", multiregs[i].fields);
211 std::sort(field_vars.begin(), field_vars.end(), lex_comp);
212
213 for(size_t j = 0; j < multiregs[i].regs.size(); j++)
214 {
215 g_reg_count++;
216 std::string var_name = prefix + tolower(multiregs[i].regs[j].name);
217
218 list.push_back(var_name);
219
220 fprintf(f, "\
221static struct hwemul_soc_reg_t %s =\n\
222{\n\
223 \"HW_%s_%s\",\n\
224 %#x,\n\
225 0", var_name.c_str(), devname.c_str(), multiregs[i].regs[j].name.c_str(), devaddr + multiregs[i].regs[j].addr);
226 if(multiregs[i].flags & REG_HAS_SCT)
227 fprintf(f, " | HWEMUL_SOC_REG_HAS_SCT");
228 fprintf(f, ",\n");
229 fprintf(f,"\
230 %u,\n\
231 {", (unsigned)field_vars.size());
232 if(field_vars.size() != 0)
233 fprintf(f, "\n");
234 for(size_t k = 0; k < field_vars.size(); k++)
235 fprintf(f, " &%s,\n", field_vars[k].c_str());
236 if(field_vars.size() != 0)
237 fprintf(f, " ");
238 fprintf(f,"\
239}\n};\n\
240\n");
241 }
242 }
243
244 return list;
245}
246
247std::vector< std::string > gen_dev_regs(FILE *f, std::string prefix, const soc_dev_t& dev)
248{
249 return gen_common_regs(f, prefix + tolower(dev.name) + "_", dev.name, dev.addr,
250 dev.regs, dev.multiregs);
251}
252
253std::vector< std::string > gen_multidev_regs(FILE *f, std::string prefix, const soc_multidev_t& mdev)
254{
255 std::vector< std::string > list;
256
257 for(size_t i = 0; i < mdev.devs.size(); i++)
258 {
259 std::vector< std::string > sub_list = gen_common_regs(f,
260 prefix + tolower(mdev.devs[i].name) + "_", mdev.devs[i].name,
261 mdev.devs[i].addr, mdev.regs, mdev.multiregs);
262 list.insert(list.end(), sub_list.begin(), sub_list.end());
263 }
264
265 return list;
266}
267
268std::vector< std::string > gen_regs(FILE *f, std::string prefix, const soc_t& soc)
269{
270 std::vector< std::string > list;
271
272 for(size_t i = 0; i < soc.devs.size(); i++)
273 {
274 std::vector< std::string > sub_list = gen_dev_regs(f,
275 prefix, soc.devs[i]);
276 list.insert(list.end(), sub_list.begin(), sub_list.end());
277 }
278
279 for(size_t i = 0; i < soc.multidevs.size(); i++)
280 {
281 std::vector< std::string > sub_list = gen_multidev_regs(f,
282 prefix, soc.multidevs[i]);
283 list.insert(list.end(), sub_list.begin(), sub_list.end());
284 }
285
286 return list;
287}
288
289std::vector< std::string > gen_socs(FILE *f, std::string prefix, const std::vector< soc_t >& socs)
290{
291 std::vector< std::string > list;
292 for(size_t i = 0; i < socs.size(); i++)
293 {
294 g_soc_count++;
295 std::string var_name = prefix + socs[i].name;
296 list.push_back(var_name);
297
298 std::vector< std::string > reg_vars = gen_regs(f, var_name + "_", socs[i]);
299
300 std::sort(reg_vars.begin(), reg_vars.end(), lex_comp);
301
302 fprintf(f, "\
303static struct hwemul_soc_t %s =\n\
304{\n\
305 \"%s\",\n\
306 %u,\n\
307 {\n", var_name.c_str(), socs[i].name.c_str(), (unsigned)reg_vars.size());
308
309 for(size_t j = 0; j < reg_vars.size(); j++)
310 fprintf(f, " &%s,\n", reg_vars[j].c_str());
311 fprintf(f, "\
312 }\n\
313};\n\
314\n");
315 }
316
317 return list;
318}
319
320void gen_impl(const std::string& filename, const std::vector< soc_t >& socs)
321{
322 FILE *f = fopen(filename.c_str(), "w");
323 if(f == NULL)
324 error("Cannot open file %s\n", filename.c_str());
325 fprint_copyright(f);
326 std::string last_part = extract_last_part(filename);
327 fprintf(f, "#include \"%s.h\"\n\n", last_part.c_str());
328
329 std::vector< std::string > socs_var = gen_socs(f, "soc_", socs);
330
331 fprintf(f, "\
332static struct hwemul_soc_list_t hwemul_soc_list =\n\
333{\n\
334 %u,\n\
335 {", (unsigned) socs_var.size());
336
337 for(size_t i = 0; i < socs_var.size(); i++)
338 {
339 fprintf(f, "&%s", socs_var[i].c_str());
340 if(i + 1 != socs_var.size())
341 fprintf(f, ", ");
342 }
343 fprintf(f, "\
344}\n\
345};\n\
346\n");
347
348 fprintf(f,"\
349struct hwemul_soc_list_t *hwemul_get_soc_list(void)\n\
350{\n\
351 return &hwemul_soc_list;\n\
352}\n\
353\n");
354
355 fclose(f);
356}
357
358void gen_files(const std::string& output, const std::vector< soc_t >& socs)
359{
360 gen_header(output + ".h");
361 gen_impl(output + ".c", socs);
362}
363
364void usage()
365{
366 printf("usage: headergen <desc file list> <output file prefix>\n");
367 exit(1);
368}
369
370int main(int argc, char **argv)
371{
372 if(argc < 3)
373 usage();
374 std::vector< soc_t > socs;
375 for(int i = 1; i < argc - 1; i++)
376 {
377 bool ret = parse_soc_desc(argv[i], socs);
378 if(!ret)
379 {
380 printf("Cannot parse '%s'\n", argv[i]);
381 return 1;
382 }
383 }
384 gen_files(argv[argc - 1], socs);
385 printf("%d socs, %d registers and %d fields dumped!\n", g_soc_count, g_reg_count, g_field_count);
386 return 0;
387} \ No newline at end of file