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