xref: /netbsd-src/sys/arch/hpc/hpc/platid.awk (revision 6be22c0c6fa32446790fb1f7515f9fd83f51dabb)
1*6be22c0cSuch#  $NetBSD: platid.awk,v 1.1 2001/01/28 02:52:18 uch Exp $
2*6be22c0cSuch#
3*6be22c0cSuch#  Copyright (c) 1999
4*6be22c0cSuch#          Shin Takemura and PocketBSD Project. All rights reserved.
5*6be22c0cSuch#
6*6be22c0cSuch#  Redistribution and use in source and binary forms, with or without
7*6be22c0cSuch#  modification, are permitted provided that the following conditions
8*6be22c0cSuch#  are met:
9*6be22c0cSuch#  1. Redistributions of source code must retain the above copyright
10*6be22c0cSuch#     notice, this list of conditions and the following disclaimer.
11*6be22c0cSuch#  2. Redistributions in binary form must reproduce the above copyright
12*6be22c0cSuch#     notice, this list of conditions and the following disclaimer in the
13*6be22c0cSuch#     documentation and/or other materials provided with the distribution.
14*6be22c0cSuch#  3. All advertising materials mentioning features or use of this software
15*6be22c0cSuch#     must display the following acknowledgement:
16*6be22c0cSuch# 	This product includes software developed by the PocketBSD project
17*6be22c0cSuch# 	and its contributors.
18*6be22c0cSuch#  4. Neither the name of the project nor the names of its contributors
19*6be22c0cSuch#     may be used to endorse or promote products derived from this software
20*6be22c0cSuch#     without specific prior written permission.
21*6be22c0cSuch#
22*6be22c0cSuch#  THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23*6be22c0cSuch#  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24*6be22c0cSuch#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25*6be22c0cSuch#  ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26*6be22c0cSuch#  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27*6be22c0cSuch#  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28*6be22c0cSuch#  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29*6be22c0cSuch#  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30*6be22c0cSuch#  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31*6be22c0cSuch#  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32*6be22c0cSuch#  SUCH DAMAGE.
33*6be22c0cSuch#
34*6be22c0cSuch
35*6be22c0cSuch#
36*6be22c0cSuch#  sub routines
37*6be22c0cSuch#
38*6be22c0cSuch
39*6be22c0cSuchfunction gen_header(file) {
40*6be22c0cSuch  printf("/*\n") >> file
41*6be22c0cSuch  printf(" *  Do not edit.\n") > file
42*6be22c0cSuch  printf(" *  This file is automatically generated by platid.awk.\n") > file
43*6be22c0cSuch  printf(" */\n") > file
44*6be22c0cSuch}
45*6be22c0cSuch
46*6be22c0cSuchfunction error() {
47*6be22c0cSuch    printf("ERROR!\n") > stderr
48*6be22c0cSuch    exit
49*6be22c0cSuch}
50*6be22c0cSuch
51*6be22c0cSuchfunction mode_check() {
52*6be22c0cSuch    if (mode != MACH && mode != CPU) {
53*6be22c0cSuch        printf("ERROR: invalid mode( = %d)\n", mode) > stderr
54*6be22c0cSuch        exit
55*6be22c0cSuch    }
56*6be22c0cSuch}
57*6be22c0cSuch
58*6be22c0cSuchfunction defname() {
59*6be22c0cSuch    mode_check()
60*6be22c0cSuch
61*6be22c0cSuch    #
62*6be22c0cSuch    #  master header
63*6be22c0cSuch    #
64*6be22c0cSuch    enumerator[mode] += 1
65*6be22c0cSuch    printf("#define PLATID_%s_%s%s_NUM\t%d\n",
66*6be22c0cSuch           mode_name[mode], nm, saved_name, enumerator[mode]) > out_h
67*6be22c0cSuch    printf("#define PLATID_%s_%s%s\t\\\n",
68*6be22c0cSuch           mode_name[mode], nm, saved_name) > out_h
69*6be22c0cSuch    printf("  ((PLATID_%s_%s%s_NUM << %s)",
70*6be22c0cSuch           mode_name[mode], nm, saved_name, shifts[mode, nest]) > out_h
71*6be22c0cSuch    if (nest) {
72*6be22c0cSuch      printf("| \\\n    PLATID_%s", mode_name[mode]) > out_h
73*6be22c0cSuch      for (i = 0; i < nest; i++) {
74*6be22c0cSuch        printf("_%s", names[i]) > out_h
75*6be22c0cSuch      }
76*6be22c0cSuch    }
77*6be22c0cSuch    printf(")\n") > out_h
78*6be22c0cSuch
79*6be22c0cSuch    #
80*6be22c0cSuch    #  mask header
81*6be22c0cSuch    #
82*6be22c0cSuch    printf("extern platid_t platid_mask_%s_%s%s;\n",
83*6be22c0cSuch	   mode_name[mode], nm, saved_name) > out_mask_h
84*6be22c0cSuch    printf("#ifdef PLATID_DEFINE_MASK_NICKNAME\n") > out_mask_h
85*6be22c0cSuch    if (mode == CPU) {
86*6be22c0cSuch        printf("#  define GENERIC_%s%s ((int)&platid_mask_%s_%s%s)\n",
87*6be22c0cSuch	       nm, saved_name,
88*6be22c0cSuch	       mode_name[mode], nm, saved_name) > out_mask_h
89*6be22c0cSuch    } else {
90*6be22c0cSuch        printf("#  define %s%s ((int)&platid_mask_%s_%s%s)\n",
91*6be22c0cSuch	       nm, saved_name,
92*6be22c0cSuch	       mode_name[mode], nm, saved_name) > out_mask_h
93*6be22c0cSuch    }
94*6be22c0cSuch    printf("#endif\n") > out_mask_h
95*6be22c0cSuch
96*6be22c0cSuch    #
97*6be22c0cSuch    #  mask holder
98*6be22c0cSuch    #
99*6be22c0cSuch    printf("platid_t platid_mask_%s_%s%s = {{\n",
100*6be22c0cSuch	   mode_name[mode], nm, saved_name) > out_mask_c
101*6be22c0cSuch    if (mode == CPU) {
102*6be22c0cSuch        printf("\tPLATID_%s_%s%s,\n",
103*6be22c0cSuch	       mode_name[mode], nm, saved_name) > out_mask_c
104*6be22c0cSuch	printf("\tPLATID_WILD\n") > out_mask_c
105*6be22c0cSuch    }
106*6be22c0cSuch    if (mode == MACH) {
107*6be22c0cSuch        if (saved_cpu != "") {
108*6be22c0cSuch	    printf("\tPLATID_CPU_%s,\n", saved_cpu) > out_mask_c
109*6be22c0cSuch        } else {
110*6be22c0cSuch	    printf("\tPLATID_WILD,\n") > out_mask_c
111*6be22c0cSuch	}
112*6be22c0cSuch	printf("\tPLATID_%s_%s%s\n",
113*6be22c0cSuch	       mode_name[mode], nm, saved_name) > out_mask_c
114*6be22c0cSuch
115*6be22c0cSuch    }
116*6be22c0cSuch    printf("}};\n") > out_mask_c
117*6be22c0cSuch
118*6be22c0cSuch}
119*6be22c0cSuch
120*6be22c0cSuchfunction flushname() {
121*6be22c0cSuch    if ( saved_name != "" ) {
122*6be22c0cSuch        defname()
123*6be22c0cSuch    }
124*6be22c0cSuch}
125*6be22c0cSuch
126*6be22c0cSuchBEGIN {
127*6be22c0cSuch  CPU = 1
128*6be22c0cSuch  MACH = 2
129*6be22c0cSuch
130*6be22c0cSuch  nest = 0
131*6be22c0cSuch  nm = ""
132*6be22c0cSuch  saved_name = ""
133*6be22c0cSuch  mode = NA
134*6be22c0cSuch  change_cpu = 0
135*6be22c0cSuch  saved_cpu = ""
136*6be22c0cSuch
137*6be22c0cSuch  mode_name[CPU] = "CPU"
138*6be22c0cSuch  mode_name[MACH] = "MACH"
139*6be22c0cSuch
140*6be22c0cSuch  shifts[CPU, 0] = "PLATID_CPU_ARCH_SHIFT"
141*6be22c0cSuch  shifts[CPU, 1] = "PLATID_CPU_SERIES_SHIFT"
142*6be22c0cSuch  shifts[CPU, 2] = "PLATID_CPU_MODEL_SHIFT"
143*6be22c0cSuch  shifts[CPU, 3] = "PLATID_CPU_SUBMODEL_SHIFT"
144*6be22c0cSuch
145*6be22c0cSuch  shifts[MACH, 0] = "PLATID_VENDOR_SHIFT"
146*6be22c0cSuch  shifts[MACH, 1] = "PLATID_SERIES_SHIFT"
147*6be22c0cSuch  shifts[MACH, 2] = "PLATID_MODEL_SHIFT"
148*6be22c0cSuch  shifts[MACH, 3] = "PLATID_SUBMODEL_SHIFT"
149*6be22c0cSuch
150*6be22c0cSuch  enumerator[CPU] = 0
151*6be22c0cSuch  enumerator[MACH] = 0
152*6be22c0cSuch
153*6be22c0cSuch  if (stderr == "") {
154*6be22c0cSuch    stderr = "/dev/stderr"
155*6be22c0cSuch  }
156*6be22c0cSuch  if (out_h == "") {
157*6be22c0cSuch    out_h = "platid_generated.h"
158*6be22c0cSuch  }
159*6be22c0cSuch  if (out_mask_h == "") {
160*6be22c0cSuch    out_mask_h = "platid_mask.h"
161*6be22c0cSuch  }
162*6be22c0cSuch  if (out_mask_c == "") {
163*6be22c0cSuch    out_mask_c = "platid_mask.c"
164*6be22c0cSuch  }
165*6be22c0cSuch
166*6be22c0cSuch  printf("files: %s %s %s\n", out_h, out_mask_h, out_mask_c) > stderr
167*6be22c0cSuch
168*6be22c0cSuch  gen_header(out_h)
169*6be22c0cSuch  gen_header(out_mask_h)
170*6be22c0cSuch  gen_header(out_mask_c)
171*6be22c0cSuch  printf("#include <machine/platid.h>\n") > out_mask_c
172*6be22c0cSuch}
173*6be22c0cSuch
174*6be22c0cSuch/^[ \t]*$/ {
175*6be22c0cSuch  next
176*6be22c0cSuch}
177*6be22c0cSuch/\/\*/ {
178*6be22c0cSuch  commentout = 1
179*6be22c0cSuch  next
180*6be22c0cSuch}
181*6be22c0cSuch/\*\// {
182*6be22c0cSuch  commentout = 0
183*6be22c0cSuch  next
184*6be22c0cSuch}
185*6be22c0cSuch/:/{
186*6be22c0cSuch  if (commentout) {
187*6be22c0cSuch    next
188*6be22c0cSuch  }
189*6be22c0cSuch  if (nest != 0) {
190*6be22c0cSuch    error()
191*6be22c0cSuch  }
192*6be22c0cSuch  if (saved_name == "CPU") {
193*6be22c0cSuch    mode = CPU
194*6be22c0cSuch  } else
195*6be22c0cSuch  if (saved_name == "MACHINE") {
196*6be22c0cSuch    mode = MACH
197*6be22c0cSuch  } else {
198*6be22c0cSuch    error()
199*6be22c0cSuch  }
200*6be22c0cSuch  saved_name = ""
201*6be22c0cSuch  next
202*6be22c0cSuch}
203*6be22c0cSuch/=/{
204*6be22c0cSuch  if (commentout) {
205*6be22c0cSuch    next
206*6be22c0cSuch  }
207*6be22c0cSuch  if (saved_name == "CPU") {
208*6be22c0cSuch    change_cpu = 1
209*6be22c0cSuch  } else {
210*6be22c0cSuch    error()
211*6be22c0cSuch  }
212*6be22c0cSuch  saved_name = ""
213*6be22c0cSuch  next
214*6be22c0cSuch}
215*6be22c0cSuch/\?/{
216*6be22c0cSuch  if (commentout) {
217*6be22c0cSuch    next
218*6be22c0cSuch  }
219*6be22c0cSuch  if (change_cpu) {
220*6be22c0cSuch    saved_cpu = ""
221*6be22c0cSuch    change_cpu = 0
222*6be22c0cSuch  } else {
223*6be22c0cSuch    error()
224*6be22c0cSuch  }
225*6be22c0cSuch  next
226*6be22c0cSuch}
227*6be22c0cSuch/{/{
228*6be22c0cSuch  if (commentout) {
229*6be22c0cSuch    next
230*6be22c0cSuch  }
231*6be22c0cSuch  flushname()
232*6be22c0cSuch
233*6be22c0cSuch  nms[nest] = nm
234*6be22c0cSuch  enums[nest] = enumerator[mode]
235*6be22c0cSuch  names[nest] = saved_name
236*6be22c0cSuch  cpus[nest] = saved_cpu
237*6be22c0cSuch
238*6be22c0cSuch  if (nest == 2) {
239*6be22c0cSuch  } else
240*6be22c0cSuch  if (nest == 0) {
241*6be22c0cSuch    nm = sprintf("%s_", saved_name)
242*6be22c0cSuch  } else {
243*6be22c0cSuch    nm = sprintf("%s%s_", nm, saved_name)
244*6be22c0cSuch  }
245*6be22c0cSuch  nest++
246*6be22c0cSuch
247*6be22c0cSuch  mode_check()
248*6be22c0cSuch  enumerator[mode] = 0
249*6be22c0cSuch  saved_name = ""
250*6be22c0cSuch
251*6be22c0cSuch  next
252*6be22c0cSuch}
253*6be22c0cSuch/}/{
254*6be22c0cSuch  if (commentout) {
255*6be22c0cSuch    next
256*6be22c0cSuch  }
257*6be22c0cSuch  flushname()
258*6be22c0cSuch  saved_name = ""
259*6be22c0cSuch  --nest
260*6be22c0cSuch  nm = nms[nest]
261*6be22c0cSuch  enumerator[mode] = enums[nest]
262*6be22c0cSuch  saved_cpu = cpus[nest]
263*6be22c0cSuch  next
264*6be22c0cSuch}
265*6be22c0cSuch/[a-zA-Z0-9]*/{
266*6be22c0cSuch  if (commentout) {
267*6be22c0cSuch    next
268*6be22c0cSuch  }
269*6be22c0cSuch  if (change_cpu) {
270*6be22c0cSuch    saved_cpu = $1
271*6be22c0cSuch    change_cpu = 0
272*6be22c0cSuch    next
273*6be22c0cSuch  }
274*6be22c0cSuch
275*6be22c0cSuch  flushname()
276*6be22c0cSuch  saved_name = toupper($1)
277*6be22c0cSuch  next
278*6be22c0cSuch}
279*6be22c0cSuch{
280*6be22c0cSuch   printf("SYNTAX ERROR: %s\n", $0) > stderr
281*6be22c0cSuch}
282