xref: /aosp_15_r20/external/dtc/convert-dtsv0-lexer.l (revision cd60bc56d4bea3af4ec04523e4d71c2b272c8aff)
1*cd60bc56SAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0-or-later */
2*cd60bc56SAndroid Build Coastguard Worker /*
3*cd60bc56SAndroid Build Coastguard Worker  * (C) Copyright David Gibson <[email protected]>, IBM Corporation.  2005, 2008.
4*cd60bc56SAndroid Build Coastguard Worker  */
5*cd60bc56SAndroid Build Coastguard Worker 
6*cd60bc56SAndroid Build Coastguard Worker %option noyywrap nounput noinput never-interactive
7*cd60bc56SAndroid Build Coastguard Worker 
8*cd60bc56SAndroid Build Coastguard Worker %x BYTESTRING
9*cd60bc56SAndroid Build Coastguard Worker %x PROPNODENAME
10*cd60bc56SAndroid Build Coastguard Worker 
11*cd60bc56SAndroid Build Coastguard Worker PROPNODECHAR	[a-zA-Z0-9,._+*#?@-]
12*cd60bc56SAndroid Build Coastguard Worker PATHCHAR	({PROPNODECHAR}|[/])
13*cd60bc56SAndroid Build Coastguard Worker LABEL		[a-zA-Z_][a-zA-Z0-9_]*
14*cd60bc56SAndroid Build Coastguard Worker STRING		\"([^\\"]|\\.)*\"
15*cd60bc56SAndroid Build Coastguard Worker WS		[[:space:]]
16*cd60bc56SAndroid Build Coastguard Worker COMMENT		"/*"([^*]|\*+[^*/])*\*+"/"
17*cd60bc56SAndroid Build Coastguard Worker LINECOMMENT	"//".*\n
18*cd60bc56SAndroid Build Coastguard Worker GAP		({WS}|{COMMENT}|{LINECOMMENT})*
19*cd60bc56SAndroid Build Coastguard Worker 
20*cd60bc56SAndroid Build Coastguard Worker %{
21*cd60bc56SAndroid Build Coastguard Worker #include <string.h>
22*cd60bc56SAndroid Build Coastguard Worker #include <stdlib.h>
23*cd60bc56SAndroid Build Coastguard Worker #include <stdarg.h>
24*cd60bc56SAndroid Build Coastguard Worker 
25*cd60bc56SAndroid Build Coastguard Worker #include <errno.h>
26*cd60bc56SAndroid Build Coastguard Worker #include <assert.h>
27*cd60bc56SAndroid Build Coastguard Worker #include <fnmatch.h>
28*cd60bc56SAndroid Build Coastguard Worker 
29*cd60bc56SAndroid Build Coastguard Worker #include "srcpos.h"
30*cd60bc56SAndroid Build Coastguard Worker #include "util.h"
31*cd60bc56SAndroid Build Coastguard Worker 
32*cd60bc56SAndroid Build Coastguard Worker static int v1_tagged; /* = 0 */
33*cd60bc56SAndroid Build Coastguard Worker static int cbase = 16;
34*cd60bc56SAndroid Build Coastguard Worker static int saw_hyphen; /* = 0 */
35*cd60bc56SAndroid Build Coastguard Worker static unsigned long long last_val;
36*cd60bc56SAndroid Build Coastguard Worker static char *last_name; /* = NULL */
37*cd60bc56SAndroid Build Coastguard Worker 
38*cd60bc56SAndroid Build Coastguard Worker static const struct {
39*cd60bc56SAndroid Build Coastguard Worker 	const char *pattern;
40*cd60bc56SAndroid Build Coastguard Worker 	int obase, width;
41*cd60bc56SAndroid Build Coastguard Worker } guess_table[] = {
42*cd60bc56SAndroid Build Coastguard Worker 	{ "*-frequency", 10, 0 },
43*cd60bc56SAndroid Build Coastguard Worker 	{ "num-*", 10, 0 },
44*cd60bc56SAndroid Build Coastguard Worker 	{ "#*-cells", 10, 0 },
45*cd60bc56SAndroid Build Coastguard Worker 	{ "*cache-line-size", 10, 0 },
46*cd60bc56SAndroid Build Coastguard Worker 	{ "*cache-block-size", 10, 0 },
47*cd60bc56SAndroid Build Coastguard Worker 	{ "*cache-size", 10, 0 },
48*cd60bc56SAndroid Build Coastguard Worker 	{ "*cache-sets", 10, 0 },
49*cd60bc56SAndroid Build Coastguard Worker 	{ "cell-index", 10, 0 },
50*cd60bc56SAndroid Build Coastguard Worker 	{ "bank-width", 10, 0 },
51*cd60bc56SAndroid Build Coastguard Worker 	{ "*-fifo-size", 10, 0 },
52*cd60bc56SAndroid Build Coastguard Worker 	{ "*-frame-size", 10, 0 },
53*cd60bc56SAndroid Build Coastguard Worker 	{ "*-channel", 10, 0 },
54*cd60bc56SAndroid Build Coastguard Worker 	{ "current-speed", 10, 0 },
55*cd60bc56SAndroid Build Coastguard Worker 	{ "phy-map", 16, 8 },
56*cd60bc56SAndroid Build Coastguard Worker 	{ "dcr-reg", 16, 3 },
57*cd60bc56SAndroid Build Coastguard Worker 	{ "reg", 16, 8 },
58*cd60bc56SAndroid Build Coastguard Worker 	{ "ranges", 16, 8},
59*cd60bc56SAndroid Build Coastguard Worker };
60*cd60bc56SAndroid Build Coastguard Worker %}
61*cd60bc56SAndroid Build Coastguard Worker 
62*cd60bc56SAndroid Build Coastguard Worker %%
63*cd60bc56SAndroid Build Coastguard Worker <*>"/include/"{GAP}{STRING}	ECHO;
64*cd60bc56SAndroid Build Coastguard Worker 
65*cd60bc56SAndroid Build Coastguard Worker <*>\"([^\\"]|\\.)*\"	ECHO;
66*cd60bc56SAndroid Build Coastguard Worker 
67*cd60bc56SAndroid Build Coastguard Worker <*>"/dts-v1/"	{
68*cd60bc56SAndroid Build Coastguard Worker 			die("Input dts file is already version 1\n");
69*cd60bc56SAndroid Build Coastguard Worker 		}
70*cd60bc56SAndroid Build Coastguard Worker 
71*cd60bc56SAndroid Build Coastguard Worker <*>"/memreserve/"	{
72*cd60bc56SAndroid Build Coastguard Worker 			if (!v1_tagged) {
73*cd60bc56SAndroid Build Coastguard Worker 				fprintf(yyout, "/dts-v1/;\n\n");
74*cd60bc56SAndroid Build Coastguard Worker 				v1_tagged = 1;
75*cd60bc56SAndroid Build Coastguard Worker 			}
76*cd60bc56SAndroid Build Coastguard Worker 
77*cd60bc56SAndroid Build Coastguard Worker 			ECHO;
78*cd60bc56SAndroid Build Coastguard Worker 			BEGIN(INITIAL);
79*cd60bc56SAndroid Build Coastguard Worker 		}
80*cd60bc56SAndroid Build Coastguard Worker 
81*cd60bc56SAndroid Build Coastguard Worker <*>{LABEL}:		ECHO;
82*cd60bc56SAndroid Build Coastguard Worker 
83*cd60bc56SAndroid Build Coastguard Worker <INITIAL>[bodh]# {
84*cd60bc56SAndroid Build Coastguard Worker 			if (*yytext == 'b')
85*cd60bc56SAndroid Build Coastguard Worker 				cbase = 2;
86*cd60bc56SAndroid Build Coastguard Worker 			else if (*yytext == 'o')
87*cd60bc56SAndroid Build Coastguard Worker 				cbase = 8;
88*cd60bc56SAndroid Build Coastguard Worker 			else if (*yytext == 'd')
89*cd60bc56SAndroid Build Coastguard Worker 				cbase = 10;
90*cd60bc56SAndroid Build Coastguard Worker 			else
91*cd60bc56SAndroid Build Coastguard Worker 				cbase = 16;
92*cd60bc56SAndroid Build Coastguard Worker 		}
93*cd60bc56SAndroid Build Coastguard Worker 
94*cd60bc56SAndroid Build Coastguard Worker <INITIAL>[0-9a-fA-F]+	{
95*cd60bc56SAndroid Build Coastguard Worker 			unsigned long long val;
96*cd60bc56SAndroid Build Coastguard Worker 			int obase = 16, width = 0;
97*cd60bc56SAndroid Build Coastguard Worker 			unsigned int i;
98*cd60bc56SAndroid Build Coastguard Worker 
99*cd60bc56SAndroid Build Coastguard Worker 			val = strtoull(yytext, NULL, cbase);
100*cd60bc56SAndroid Build Coastguard Worker 
101*cd60bc56SAndroid Build Coastguard Worker 			if (saw_hyphen)
102*cd60bc56SAndroid Build Coastguard Worker 				val = val - last_val + 1;
103*cd60bc56SAndroid Build Coastguard Worker 
104*cd60bc56SAndroid Build Coastguard Worker 			if (last_name) {
105*cd60bc56SAndroid Build Coastguard Worker 				for (i = 0; i < ARRAY_SIZE(guess_table); i++)
106*cd60bc56SAndroid Build Coastguard Worker 					if (fnmatch(guess_table[i].pattern,
107*cd60bc56SAndroid Build Coastguard Worker 					    last_name, 0) == 0) {
108*cd60bc56SAndroid Build Coastguard Worker 						obase = guess_table[i].obase;
109*cd60bc56SAndroid Build Coastguard Worker 						width = guess_table[i].width;
110*cd60bc56SAndroid Build Coastguard Worker 					}
111*cd60bc56SAndroid Build Coastguard Worker 			} else {
112*cd60bc56SAndroid Build Coastguard Worker 				obase = 16;
113*cd60bc56SAndroid Build Coastguard Worker 				width = 16;
114*cd60bc56SAndroid Build Coastguard Worker 			}
115*cd60bc56SAndroid Build Coastguard Worker 
116*cd60bc56SAndroid Build Coastguard Worker 			if (cbase != 16)
117*cd60bc56SAndroid Build Coastguard Worker 				obase = cbase;
118*cd60bc56SAndroid Build Coastguard Worker 
119*cd60bc56SAndroid Build Coastguard Worker 			switch (obase) {
120*cd60bc56SAndroid Build Coastguard Worker 			case 2:
121*cd60bc56SAndroid Build Coastguard Worker 			case 16:
122*cd60bc56SAndroid Build Coastguard Worker 				fprintf(yyout, "0x%0*llx", width, val);
123*cd60bc56SAndroid Build Coastguard Worker 				break;
124*cd60bc56SAndroid Build Coastguard Worker 			case 8:
125*cd60bc56SAndroid Build Coastguard Worker 				fprintf(yyout, "0%0*llo", width, val);
126*cd60bc56SAndroid Build Coastguard Worker 				break;
127*cd60bc56SAndroid Build Coastguard Worker 			case 10:
128*cd60bc56SAndroid Build Coastguard Worker 				fprintf(yyout, "%*llu", width, val);
129*cd60bc56SAndroid Build Coastguard Worker 				break;
130*cd60bc56SAndroid Build Coastguard Worker 			}
131*cd60bc56SAndroid Build Coastguard Worker 
132*cd60bc56SAndroid Build Coastguard Worker 			cbase = 16;
133*cd60bc56SAndroid Build Coastguard Worker 			last_val = val;
134*cd60bc56SAndroid Build Coastguard Worker 			saw_hyphen = 0;
135*cd60bc56SAndroid Build Coastguard Worker 		}
136*cd60bc56SAndroid Build Coastguard Worker 
137*cd60bc56SAndroid Build Coastguard Worker \&{LABEL}		ECHO;
138*cd60bc56SAndroid Build Coastguard Worker 
139*cd60bc56SAndroid Build Coastguard Worker "&{/"{PATHCHAR}+\}	ECHO;
140*cd60bc56SAndroid Build Coastguard Worker 
141*cd60bc56SAndroid Build Coastguard Worker <INITIAL>"&/"{PATHCHAR}+ fprintf(yyout, "&{/%s}", yytext + 2);
142*cd60bc56SAndroid Build Coastguard Worker 
143*cd60bc56SAndroid Build Coastguard Worker <BYTESTRING>[0-9a-fA-F]{2} ECHO;
144*cd60bc56SAndroid Build Coastguard Worker 
145*cd60bc56SAndroid Build Coastguard Worker <BYTESTRING>"]"	{
146*cd60bc56SAndroid Build Coastguard Worker 			ECHO;
147*cd60bc56SAndroid Build Coastguard Worker 			BEGIN(INITIAL);
148*cd60bc56SAndroid Build Coastguard Worker 		}
149*cd60bc56SAndroid Build Coastguard Worker 
150*cd60bc56SAndroid Build Coastguard Worker <PROPNODENAME>{PROPNODECHAR}+ {
151*cd60bc56SAndroid Build Coastguard Worker 			ECHO;
152*cd60bc56SAndroid Build Coastguard Worker 			last_name = xstrdup(yytext);
153*cd60bc56SAndroid Build Coastguard Worker 			BEGIN(INITIAL);
154*cd60bc56SAndroid Build Coastguard Worker 		}
155*cd60bc56SAndroid Build Coastguard Worker 
156*cd60bc56SAndroid Build Coastguard Worker <*>{GAP}	ECHO;
157*cd60bc56SAndroid Build Coastguard Worker 
158*cd60bc56SAndroid Build Coastguard Worker <*>-		{	/* Hack to convert old style memreserves */
159*cd60bc56SAndroid Build Coastguard Worker 			saw_hyphen = 1;
160*cd60bc56SAndroid Build Coastguard Worker 			fprintf(yyout, " ");
161*cd60bc56SAndroid Build Coastguard Worker 		}
162*cd60bc56SAndroid Build Coastguard Worker 
163*cd60bc56SAndroid Build Coastguard Worker <*>.		{
164*cd60bc56SAndroid Build Coastguard Worker 			if (!v1_tagged) {
165*cd60bc56SAndroid Build Coastguard Worker 				fprintf(yyout, "/dts-v1/;\n\n");
166*cd60bc56SAndroid Build Coastguard Worker 				v1_tagged = 1;
167*cd60bc56SAndroid Build Coastguard Worker 			}
168*cd60bc56SAndroid Build Coastguard Worker 
169*cd60bc56SAndroid Build Coastguard Worker 			ECHO;
170*cd60bc56SAndroid Build Coastguard Worker 			if (yytext[0] == '[') {
171*cd60bc56SAndroid Build Coastguard Worker 				BEGIN(BYTESTRING);
172*cd60bc56SAndroid Build Coastguard Worker 			}
173*cd60bc56SAndroid Build Coastguard Worker 			if ((yytext[0] == '{')
174*cd60bc56SAndroid Build Coastguard Worker 			    || (yytext[0] == ';')) {
175*cd60bc56SAndroid Build Coastguard Worker 				BEGIN(PROPNODENAME);
176*cd60bc56SAndroid Build Coastguard Worker 			}
177*cd60bc56SAndroid Build Coastguard Worker 		}
178*cd60bc56SAndroid Build Coastguard Worker 
179*cd60bc56SAndroid Build Coastguard Worker %%
180*cd60bc56SAndroid Build Coastguard Worker /* Usage related data. */
181*cd60bc56SAndroid Build Coastguard Worker static const char usage_synopsis[] = "convert-dtsv0 [options] <v0 dts file>...";
182*cd60bc56SAndroid Build Coastguard Worker static const char usage_short_opts[] = "" USAGE_COMMON_SHORT_OPTS;
183*cd60bc56SAndroid Build Coastguard Worker static struct option const usage_long_opts[] = {
184*cd60bc56SAndroid Build Coastguard Worker 	USAGE_COMMON_LONG_OPTS
185*cd60bc56SAndroid Build Coastguard Worker };
186*cd60bc56SAndroid Build Coastguard Worker static const char * const usage_opts_help[] = {
187*cd60bc56SAndroid Build Coastguard Worker 	USAGE_COMMON_OPTS_HELP
188*cd60bc56SAndroid Build Coastguard Worker };
189*cd60bc56SAndroid Build Coastguard Worker 
190*cd60bc56SAndroid Build Coastguard Worker static void convert_file(const char *fname)
191*cd60bc56SAndroid Build Coastguard Worker {
192*cd60bc56SAndroid Build Coastguard Worker 	const char suffix[] = "v1";
193*cd60bc56SAndroid Build Coastguard Worker 	int len = strlen(fname);
194*cd60bc56SAndroid Build Coastguard Worker 	char *newname;
195*cd60bc56SAndroid Build Coastguard Worker 
196*cd60bc56SAndroid Build Coastguard Worker 	newname = xmalloc(len + sizeof(suffix));
197*cd60bc56SAndroid Build Coastguard Worker 	memcpy(newname, fname, len);
198*cd60bc56SAndroid Build Coastguard Worker 	memcpy(newname + len, suffix, sizeof(suffix));
199*cd60bc56SAndroid Build Coastguard Worker 
200*cd60bc56SAndroid Build Coastguard Worker 	yyin = fopen(fname, "r");
201*cd60bc56SAndroid Build Coastguard Worker 	if (!yyin)
202*cd60bc56SAndroid Build Coastguard Worker 		die("Couldn't open input file %s: %s\n",
203*cd60bc56SAndroid Build Coastguard Worker 		    fname, strerror(errno));
204*cd60bc56SAndroid Build Coastguard Worker 
205*cd60bc56SAndroid Build Coastguard Worker 	yyout = fopen(newname, "w");
206*cd60bc56SAndroid Build Coastguard Worker 	if (!yyout)
207*cd60bc56SAndroid Build Coastguard Worker 		die("Couldn't open output file %s: %s\n",
208*cd60bc56SAndroid Build Coastguard Worker 		    newname, strerror(errno));
209*cd60bc56SAndroid Build Coastguard Worker 
210*cd60bc56SAndroid Build Coastguard Worker 	while(yylex())
211*cd60bc56SAndroid Build Coastguard Worker 		;
212*cd60bc56SAndroid Build Coastguard Worker 
213*cd60bc56SAndroid Build Coastguard Worker 	free(newname);
214*cd60bc56SAndroid Build Coastguard Worker }
215*cd60bc56SAndroid Build Coastguard Worker 
main(int argc,char * argv[])216*cd60bc56SAndroid Build Coastguard Worker int main(int argc, char *argv[])
217*cd60bc56SAndroid Build Coastguard Worker {
218*cd60bc56SAndroid Build Coastguard Worker 	int opt;
219*cd60bc56SAndroid Build Coastguard Worker 	int i;
220*cd60bc56SAndroid Build Coastguard Worker 
221*cd60bc56SAndroid Build Coastguard Worker 	while ((opt = util_getopt_long()) != EOF) {
222*cd60bc56SAndroid Build Coastguard Worker 		switch (opt) {
223*cd60bc56SAndroid Build Coastguard Worker 		case_USAGE_COMMON_FLAGS
224*cd60bc56SAndroid Build Coastguard Worker 		}
225*cd60bc56SAndroid Build Coastguard Worker 	}
226*cd60bc56SAndroid Build Coastguard Worker 	if (argc < 2)
227*cd60bc56SAndroid Build Coastguard Worker 		usage("missing filename");
228*cd60bc56SAndroid Build Coastguard Worker 
229*cd60bc56SAndroid Build Coastguard Worker 	for (i = 1; i < argc; i++) {
230*cd60bc56SAndroid Build Coastguard Worker 		fprintf(stderr, "Converting %s from dts v0 to dts v1\n", argv[i]);
231*cd60bc56SAndroid Build Coastguard Worker 		convert_file(argv[i]);
232*cd60bc56SAndroid Build Coastguard Worker 	}
233*cd60bc56SAndroid Build Coastguard Worker 
234*cd60bc56SAndroid Build Coastguard Worker 	exit(0);
235*cd60bc56SAndroid Build Coastguard Worker }
236