11ec0b899SSakari Ailus#!/usr/bin/perl -w 21ec0b899SSakari Ailus# SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause 31ec0b899SSakari Ailus# Copyright (C) 2019--2020 Intel Corporation 41ec0b899SSakari Ailus 51ec0b899SSakari Ailususe Getopt::Long qw(:config no_ignore_case); 61ec0b899SSakari Ailususe File::Basename; 71ec0b899SSakari Ailus 83bf10ebcSSakari Ailusmy $ccsregs = "ccs-regs.asc"; 91ec0b899SSakari Ailusmy $header; 101ec0b899SSakari Ailusmy $regarray; 111ec0b899SSakari Ailusmy $limitc; 121ec0b899SSakari Ailusmy $limith; 131ec0b899SSakari Ailusmy $kernel; 141ec0b899SSakari Ailusmy $help; 151ec0b899SSakari Ailus 161ec0b899SSakari AilusGetOptions("ccsregs|c=s" => \$ccsregs, 171ec0b899SSakari Ailus "header|e=s" => \$header, 181ec0b899SSakari Ailus "regarray|r=s" => \$regarray, 191ec0b899SSakari Ailus "limitc|l=s" => \$limitc, 201ec0b899SSakari Ailus "limith|L=s" => \$limith, 211ec0b899SSakari Ailus "kernel|k" => \$kernel, 221ec0b899SSakari Ailus "help|h" => \$help) or die "can't parse options"; 231ec0b899SSakari Ailus 241ec0b899SSakari Ailus$help = 1 if ! defined $header || ! defined $limitc || ! defined $limith; 251ec0b899SSakari Ailus 261ec0b899SSakari Ailusif (defined $help) { 271ec0b899SSakari Ailus print <<EOH 281ec0b899SSakari Ailus$0 - Create CCS register definitions for C 291ec0b899SSakari Ailus 303bf10ebcSSakari Ailususage: $0 -c ccs-regs.asc -e header -r regarray -l limit-c -L limit-header [-k] 311ec0b899SSakari Ailus 321ec0b899SSakari Ailus -c ccs register file 331ec0b899SSakari Ailus -e header file name 341ec0b899SSakari Ailus -r register description array file name 351ec0b899SSakari Ailus -l limit and capability array file name 361ec0b899SSakari Ailus -L limit and capability header file name 371ec0b899SSakari Ailus -k generate files for kernel space consumption 381ec0b899SSakari AilusEOH 391ec0b899SSakari Ailus ; 401ec0b899SSakari Ailus exit 0; 411ec0b899SSakari Ailus} 421ec0b899SSakari Ailus 431ec0b899SSakari Ailusmy $lh_hdr = ! defined $kernel 441ec0b899SSakari Ailus ? '#include "ccs-os.h"' . "\n" 451ec0b899SSakari Ailus : "#include <linux/bits.h>\n#include <linux/types.h>\n"; 461ec0b899SSakari Ailusmy $uint32_t = ! defined $kernel ? 'uint32_t' : 'u32'; 471ec0b899SSakari Ailusmy $uint16_t = ! defined $kernel ? 'uint16_t' : 'u16'; 481ec0b899SSakari Ailus 491ec0b899SSakari Ailusopen(my $R, "< $ccsregs") or die "can't open $ccsregs"; 501ec0b899SSakari Ailus 511ec0b899SSakari Ailusopen(my $H, "> $header") or die "can't open $header"; 521ec0b899SSakari Ailusmy $A; 531ec0b899SSakari Ailusif (defined $regarray) { 541ec0b899SSakari Ailus open($A, "> $regarray") or die "can't open $regarray"; 551ec0b899SSakari Ailus} 561ec0b899SSakari Ailusopen(my $LC, "> $limitc") or die "can't open $limitc"; 571ec0b899SSakari Ailusopen(my $LH, "> $limith") or die "can't open $limith"; 581ec0b899SSakari Ailus 591ec0b899SSakari Ailusmy %this; 601ec0b899SSakari Ailus 611ec0b899SSakari Ailussub is_limit_reg($) { 621ec0b899SSakari Ailus my $addr = hex $_[0]; 631ec0b899SSakari Ailus 641ec0b899SSakari Ailus return 0 if $addr < 0x40; # weed out status registers 651ec0b899SSakari Ailus return 0 if $addr >= 0x100 && $addr < 0xfff; # weed out configuration registers 661ec0b899SSakari Ailus 671ec0b899SSakari Ailus return 1; 681ec0b899SSakari Ailus} 691ec0b899SSakari Ailus 701ec0b899SSakari Ailusmy $uc_header = basename uc $header; 711ec0b899SSakari Ailus$uc_header =~ s/[^A-Z0-9]/_/g; 721ec0b899SSakari Ailus 731ec0b899SSakari Ailusmy $copyright = "/* Copyright (C) 2019--2020 Intel Corporation */\n"; 741ec0b899SSakari Ailusmy $license = "SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause"; 75*caad7940SBernhard Wimmermy $note = "/*\n * Generated by $0;\n * do not modify.\n */\n"; 761ec0b899SSakari Ailus 771ec0b899SSakari Ailusfor my $fh ($A, $LC) { 78*caad7940SBernhard Wimmer print $fh "// $license\n$copyright$note\n" if defined $fh; 791ec0b899SSakari Ailus} 801ec0b899SSakari Ailus 811ec0b899SSakari Ailusfor my $fh ($H, $LH) { 82*caad7940SBernhard Wimmer print $fh "/* $license */\n$copyright$note\n"; 831ec0b899SSakari Ailus} 841ec0b899SSakari Ailus 851ec0b899SSakari Ailussub bit_def($) { 861ec0b899SSakari Ailus my $bit = shift @_; 871ec0b899SSakari Ailus 881ec0b899SSakari Ailus return "BIT($bit)" if defined $kernel; 891ec0b899SSakari Ailus return "(1U << $bit)" if $bit =~ /^[a-zA-Z0-9_]+$/; 901ec0b899SSakari Ailus return "(1U << ($bit))"; 911ec0b899SSakari Ailus} 921ec0b899SSakari Ailus 931ec0b899SSakari Ailusprint $H <<EOF 941ec0b899SSakari Ailus#ifndef __${uc_header}__ 951ec0b899SSakari Ailus#define __${uc_header}__ 961ec0b899SSakari Ailus 971ec0b899SSakari AilusEOF 981ec0b899SSakari Ailus ; 991ec0b899SSakari Ailus 1001ec0b899SSakari Ailusprint $H "#include <linux/bits.h>\n\n" if defined $kernel; 1011ec0b899SSakari Ailus 1021ec0b899SSakari Ailusprint $H <<EOF 1031ec0b899SSakari Ailus#define CCS_FL_BASE 16 1041ec0b899SSakari AilusEOF 1051ec0b899SSakari Ailus ; 1061ec0b899SSakari Ailus 1071ec0b899SSakari Ailusprint $H "#define CCS_FL_16BIT " . bit_def("CCS_FL_BASE") . "\n"; 1081ec0b899SSakari Ailusprint $H "#define CCS_FL_32BIT " . bit_def("CCS_FL_BASE + 1") . "\n"; 1091ec0b899SSakari Ailusprint $H "#define CCS_FL_FLOAT_IREAL " . bit_def("CCS_FL_BASE + 2") . "\n"; 1101ec0b899SSakari Ailusprint $H "#define CCS_FL_IREAL " . bit_def("CCS_FL_BASE + 3") . "\n"; 1111ec0b899SSakari Ailus 1121ec0b899SSakari Ailusprint $H <<EOF 1131ec0b899SSakari Ailus#define CCS_R_ADDR(r) ((r) & 0xffff) 1141ec0b899SSakari Ailus 1151ec0b899SSakari AilusEOF 1161ec0b899SSakari Ailus ; 1171ec0b899SSakari Ailus 1181ec0b899SSakari Ailusprint $A <<EOF 1191ec0b899SSakari Ailus#include <stdint.h> 1201ec0b899SSakari Ailus#include <stdio.h> 1211ec0b899SSakari Ailus#include "ccs-extra.h" 1221ec0b899SSakari Ailus#include "ccs-regs.h" 1231ec0b899SSakari Ailus 1241ec0b899SSakari AilusEOF 1251ec0b899SSakari Ailus if defined $A; 1261ec0b899SSakari Ailus 1271ec0b899SSakari Ailusmy $uc_limith = basename uc $limith; 1281ec0b899SSakari Ailus$uc_limith =~ s/[^A-Z0-9]/_/g; 1291ec0b899SSakari Ailus 1301ec0b899SSakari Ailusprint $LH <<EOF 1311ec0b899SSakari Ailus#ifndef __${uc_limith}__ 1321ec0b899SSakari Ailus#define __${uc_limith}__ 1331ec0b899SSakari Ailus 1341ec0b899SSakari Ailus$lh_hdr 1351ec0b899SSakari Ailusstruct ccs_limit { 1361ec0b899SSakari Ailus $uint32_t reg; 1371ec0b899SSakari Ailus $uint16_t size; 1381ec0b899SSakari Ailus $uint16_t flags; 1391ec0b899SSakari Ailus const char *name; 1401ec0b899SSakari Ailus}; 1411ec0b899SSakari Ailus 1421ec0b899SSakari AilusEOF 1431ec0b899SSakari Ailus ; 1441ec0b899SSakari Ailusprint $LH "#define CCS_L_FL_SAME_REG " . bit_def(0) . "\n\n"; 1451ec0b899SSakari Ailus 1461ec0b899SSakari Ailusprint $LH <<EOF 1471ec0b899SSakari Ailusextern const struct ccs_limit ccs_limits[]; 1481ec0b899SSakari Ailus 1491ec0b899SSakari AilusEOF 1501ec0b899SSakari Ailus ; 1511ec0b899SSakari Ailus 1521ec0b899SSakari Ailusprint $LC <<EOF 1531ec0b899SSakari Ailus#include "ccs-limits.h" 1541ec0b899SSakari Ailus#include "ccs-regs.h" 1551ec0b899SSakari Ailus 1561ec0b899SSakari Ailusconst struct ccs_limit ccs_limits[] = { 1571ec0b899SSakari AilusEOF 1581ec0b899SSakari Ailus ; 1591ec0b899SSakari Ailus 1601ec0b899SSakari Ailusmy $limitcount = 0; 1611ec0b899SSakari Ailusmy $argdescs; 1621ec0b899SSakari Ailusmy $reglist = "const struct ccs_reg_desc ccs_reg_desc[] = {\n"; 1631ec0b899SSakari Ailus 1641ec0b899SSakari Ailussub name_split($$) { 1651ec0b899SSakari Ailus my ($name, $addr) = @_; 1661ec0b899SSakari Ailus my $args; 1671ec0b899SSakari Ailus 1681ec0b899SSakari Ailus $name =~ /([^\(]+?)(\(.*)/; 1691ec0b899SSakari Ailus ($name, $args) = ($1, $2); 1701ec0b899SSakari Ailus $args = [split /,\s*/, $args]; 1711ec0b899SSakari Ailus foreach my $t (@$args) { 1721ec0b899SSakari Ailus $t =~ s/[\(\)]//g; 1731ec0b899SSakari Ailus $t =~ s/\//\\\//g; 1741ec0b899SSakari Ailus } 1751ec0b899SSakari Ailus 1761ec0b899SSakari Ailus return ($name, $addr, $args); 1771ec0b899SSakari Ailus} 1781ec0b899SSakari Ailus 1791ec0b899SSakari Ailussub tabconv($) { 1801ec0b899SSakari Ailus $_ = shift; 1811ec0b899SSakari Ailus 1821ec0b899SSakari Ailus my @l = split "\n", $_; 1831ec0b899SSakari Ailus 1841ec0b899SSakari Ailus map { 1851ec0b899SSakari Ailus s/ {8,8}/\t/g; 1861ec0b899SSakari Ailus s/\t\K +//; 1871ec0b899SSakari Ailus } @l; 1881ec0b899SSakari Ailus 1891ec0b899SSakari Ailus return (join "\n", @l) . "\n"; 1901ec0b899SSakari Ailus} 1911ec0b899SSakari Ailus 1921ec0b899SSakari Ailussub elem_size(@) { 1931ec0b899SSakari Ailus my @flags = @_; 1941ec0b899SSakari Ailus 1951ec0b899SSakari Ailus return 2 if grep /^16$/, @flags; 1961ec0b899SSakari Ailus return 4 if grep /^32$/, @flags; 1971ec0b899SSakari Ailus return 1; 1981ec0b899SSakari Ailus} 1991ec0b899SSakari Ailus 2001ec0b899SSakari Ailussub arr_size($) { 2011ec0b899SSakari Ailus my $this = $_[0]; 2021ec0b899SSakari Ailus my $size = $this->{elsize}; 2031ec0b899SSakari Ailus my $h = $this->{argparams}; 2041ec0b899SSakari Ailus 2051ec0b899SSakari Ailus foreach my $arg (@{$this->{args}}) { 2061ec0b899SSakari Ailus my $apref = $h->{$arg}; 2071ec0b899SSakari Ailus 2081ec0b899SSakari Ailus $size *= $apref->{max} - $apref->{min} + 1; 2091ec0b899SSakari Ailus } 2101ec0b899SSakari Ailus 2111ec0b899SSakari Ailus return $size; 2121ec0b899SSakari Ailus} 2131ec0b899SSakari Ailus 2141ec0b899SSakari Ailussub print_args($$$) { 2151ec0b899SSakari Ailus my ($this, $postfix, $is_same_reg) = @_; 2161ec0b899SSakari Ailus my ($args, $argparams, $name) = 2171ec0b899SSakari Ailus ($this->{args}, $this->{argparams}, $this->{name}); 2181ec0b899SSakari Ailus my $varname = "ccs_reg_arg_" . (lc $name) . $postfix; 2191ec0b899SSakari Ailus my @mins; 2201ec0b899SSakari Ailus my @sorted_args = @{$this->{sorted_args}}; 2211ec0b899SSakari Ailus my $lim_arg; 2221ec0b899SSakari Ailus my $size = arr_size($this); 2231ec0b899SSakari Ailus 2241ec0b899SSakari Ailus $argdescs .= "static const struct ccs_reg_arg " . $varname . "[] = {\n"; 2251ec0b899SSakari Ailus 2261ec0b899SSakari Ailus foreach my $sorted_arg (@sorted_args) { 2271ec0b899SSakari Ailus push @mins, $argparams->{$sorted_arg}->{min}; 2281ec0b899SSakari Ailus } 2291ec0b899SSakari Ailus 2301ec0b899SSakari Ailus foreach my $sorted_arg (@sorted_args) { 2311ec0b899SSakari Ailus my $h = $argparams->{$sorted_arg}; 2321ec0b899SSakari Ailus 2331ec0b899SSakari Ailus $argdescs .= "\t{ \"$sorted_arg\", $h->{min}, $h->{max}, $h->{elsize} },\n"; 2341ec0b899SSakari Ailus 2351ec0b899SSakari Ailus $lim_arg .= defined $lim_arg ? ", $h->{min}" : "$h->{min}"; 2361ec0b899SSakari Ailus } 2371ec0b899SSakari Ailus 2381ec0b899SSakari Ailus $argdescs .= "};\n\n"; 2391ec0b899SSakari Ailus 2401ec0b899SSakari Ailus $reglist .= "\t{ CCS_R_" . (uc $name) . "(" . (join ",", (@mins)) . 2411ec0b899SSakari Ailus "), $size, sizeof($varname) / sizeof(*$varname)," . 2421ec0b899SSakari Ailus " \"" . (lc $name) . "\", $varname },\n"; 2431ec0b899SSakari Ailus 2441ec0b899SSakari Ailus print $LC tabconv sprintf "\t{ CCS_R_" . (uc $name) . "($lim_arg), " . 2451ec0b899SSakari Ailus $size . ", " . ($is_same_reg ? "CCS_L_FL_SAME_REG" : "0") . 2461ec0b899SSakari Ailus ", \"$name" . (defined $this->{discontig} ? " $lim_arg" : "") . "\" },\n" 2471ec0b899SSakari Ailus if is_limit_reg $this->{base_addr}; 2481ec0b899SSakari Ailus} 2491ec0b899SSakari Ailus 2501ec0b899SSakari Ailusmy $hdr_data; 2511ec0b899SSakari Ailus 2521ec0b899SSakari Ailuswhile (<$R>) { 2531ec0b899SSakari Ailus chop; 2541ec0b899SSakari Ailus s/^\s*//; 2551ec0b899SSakari Ailus next if /^[#;]/ || /^$/; 2561ec0b899SSakari Ailus if (s/^-\s*//) { 2571ec0b899SSakari Ailus if (s/^b\s*//) { 2581ec0b899SSakari Ailus my ($bit, $addr) = split /\t+/; 2591ec0b899SSakari Ailus $bit = uc $bit; 2601ec0b899SSakari Ailus $hdr_data .= sprintf "#define %-62s %s", "CCS_" . (uc ${this{name}}) ."_$bit", bit_def($addr) . "\n"; 2611ec0b899SSakari Ailus } elsif (s/^f\s*//) { 2621ec0b899SSakari Ailus s/[,\.-]/_/g; 2631ec0b899SSakari Ailus my @a = split /\s+/; 2641ec0b899SSakari Ailus my ($msb, $lsb, $this_field) = reverse @a; 2651ec0b899SSakari Ailus @a = ( { "name" => "SHIFT", "addr" => $lsb, "fmt" => "%uU", }, 2661ec0b899SSakari Ailus { "name" => "MASK", "addr" => (1 << ($msb + 1)) - 1 - ((1 << $lsb) - 1), "fmt" => "0x%" . join(".", ($this{"elsize"} >> 2) x 2) . "x" } ); 2671ec0b899SSakari Ailus $this{"field"} = $this_field; 2681ec0b899SSakari Ailus foreach my $ar (@a) { 2691ec0b899SSakari Ailus #print $ar->{fmt}."\n"; 2701ec0b899SSakari Ailus $hdr_data .= sprintf "#define %-62s " . $ar->{"fmt"} . "\n", "CCS_" . (uc $this{"name"}) . (defined $this_field ? "_" . uc $this_field : "") . "_" . $ar->{"name"}, $ar->{"addr"} . "\n"; 2711ec0b899SSakari Ailus } 2721ec0b899SSakari Ailus } elsif (s/^e\s*//) { 2731ec0b899SSakari Ailus s/[,\.-]/_/g; 2741ec0b899SSakari Ailus my ($enum, $addr) = split /\s+/; 2751ec0b899SSakari Ailus $enum = uc $enum; 2761ec0b899SSakari Ailus $hdr_data .= sprintf "#define %-62s %s", "CCS_" . (uc ${this{name}}) . (defined $this{"field"} ? "_" . uc $this{"field"} : "") ."_$enum", $addr . ($addr =~ /0x/i ? "" : "U") . "\n"; 2771ec0b899SSakari Ailus } elsif (s/^l\s*//) { 2781ec0b899SSakari Ailus my ($arg, $min, $max, $elsize, @discontig) = split /\s+/; 2791ec0b899SSakari Ailus my $size; 2801ec0b899SSakari Ailus 2811ec0b899SSakari Ailus foreach my $num ($min, $max) { 2821ec0b899SSakari Ailus $num = hex $num if $num =~ /0x/i; 2831ec0b899SSakari Ailus } 2841ec0b899SSakari Ailus 2851ec0b899SSakari Ailus $hdr_data .= sprintf "#define %-62s %s", "CCS_LIM_" . (uc ${this{name}} . "_MIN_$arg"), $min . ($min =~ /0x/i ? "" : "U") . "\n"; 2861ec0b899SSakari Ailus $hdr_data .= sprintf "#define %-62s %s", "CCS_LIM_" . (uc ${this{name}} . "_MAX_$arg"), $max . ($max =~ /0x/i ? "" : "U") . "\n"; 2871ec0b899SSakari Ailus 2881ec0b899SSakari Ailus my $h = $this{argparams}; 2891ec0b899SSakari Ailus 2901ec0b899SSakari Ailus $h->{$arg} = { "min" => $min, 2911ec0b899SSakari Ailus "max" => $max, 2921ec0b899SSakari Ailus "elsize" => $elsize =~ /^0x/ ? hex $elsize : $elsize, 2931ec0b899SSakari Ailus "discontig" => \@discontig }; 2941ec0b899SSakari Ailus 2951ec0b899SSakari Ailus $this{discontig} = $arg if @discontig; 2961ec0b899SSakari Ailus 2971ec0b899SSakari Ailus next if $#{$this{args}} + 1 != scalar keys %{$this{argparams}}; 2981ec0b899SSakari Ailus 2991ec0b899SSakari Ailus my $reg_formula = "($this{addr}"; 3001ec0b899SSakari Ailus my $lim_formula; 3011ec0b899SSakari Ailus 3021ec0b899SSakari Ailus foreach my $arg (@{$this{args}}) { 3031ec0b899SSakari Ailus my $d = $h->{$arg}->{discontig}; 3041ec0b899SSakari Ailus my $times = $h->{$arg}->{elsize} != 1 ? 3051ec0b899SSakari Ailus " * " . $h->{$arg}->{elsize} : ""; 3061ec0b899SSakari Ailus 3071ec0b899SSakari Ailus if (@$d) { 3081ec0b899SSakari Ailus my ($lim, $offset) = split /,/, $d->[0]; 3091ec0b899SSakari Ailus 3101ec0b899SSakari Ailus $reg_formula .= " + (($arg) < $lim ? ($arg)$times : $offset + (($arg) - $lim)$times)"; 3111ec0b899SSakari Ailus } else { 3121ec0b899SSakari Ailus $reg_formula .= " + ($arg)$times"; 3131ec0b899SSakari Ailus } 3141ec0b899SSakari Ailus 3151ec0b899SSakari Ailus $lim_formula .= (defined $lim_formula ? " + " : "") . "($arg)$times"; 3161ec0b899SSakari Ailus } 3171ec0b899SSakari Ailus 3181ec0b899SSakari Ailus $reg_formula .= ")\n"; 3191ec0b899SSakari Ailus $lim_formula =~ s/^\(([a-z0-9]+)\)$/$1/i; 3201ec0b899SSakari Ailus 3211ec0b899SSakari Ailus print $H tabconv sprintf("#define %-62s %s", "CCS_R_" . (uc $this{name}) . 3221ec0b899SSakari Ailus $this{arglist}, $reg_formula); 3231ec0b899SSakari Ailus 3241ec0b899SSakari Ailus print $H tabconv $hdr_data; 3251ec0b899SSakari Ailus undef $hdr_data; 3261ec0b899SSakari Ailus 3271ec0b899SSakari Ailus # Sort arguments in descending order by size 3281ec0b899SSakari Ailus @{$this{sorted_args}} = sort { 3291ec0b899SSakari Ailus $h->{$a}->{elsize} <= $h->{$b}->{elsize} 3301ec0b899SSakari Ailus } @{$this{args}}; 3311ec0b899SSakari Ailus 3321ec0b899SSakari Ailus if (defined $this{discontig}) { 3331ec0b899SSakari Ailus my $da = $this{argparams}->{$this{discontig}}; 3341ec0b899SSakari Ailus my ($first_discontig) = split /,/, $da->{discontig}->[0]; 3351ec0b899SSakari Ailus my $max = $da->{max}; 3361ec0b899SSakari Ailus 3371ec0b899SSakari Ailus $da->{max} = $first_discontig - 1; 3381ec0b899SSakari Ailus print_args(\%this, "", 0); 3391ec0b899SSakari Ailus 3401ec0b899SSakari Ailus $da->{min} = $da->{max} + 1; 3411ec0b899SSakari Ailus $da->{max} = $max; 3421ec0b899SSakari Ailus print_args(\%this, $first_discontig, 1); 3431ec0b899SSakari Ailus } else { 3441ec0b899SSakari Ailus print_args(\%this, "", 0); 3451ec0b899SSakari Ailus } 3461ec0b899SSakari Ailus 3471ec0b899SSakari Ailus next unless is_limit_reg $this{base_addr}; 3481ec0b899SSakari Ailus 3491ec0b899SSakari Ailus print $LH tabconv sprintf "#define %-63s%s\n", 3501ec0b899SSakari Ailus "CCS_L_" . (uc $this{name}) . "_OFFSET(" . 3511ec0b899SSakari Ailus (join ", ", @{$this{args}}) . ")", "($lim_formula)"; 3521ec0b899SSakari Ailus } 3531ec0b899SSakari Ailus 3541ec0b899SSakari Ailus if (! @{$this{args}}) { 3551ec0b899SSakari Ailus print $H tabconv($hdr_data); 3561ec0b899SSakari Ailus undef $hdr_data; 3571ec0b899SSakari Ailus } 3581ec0b899SSakari Ailus 3591ec0b899SSakari Ailus next; 3601ec0b899SSakari Ailus } 3611ec0b899SSakari Ailus 3621ec0b899SSakari Ailus my ($name, $addr, @flags) = split /\t+/, $_; 3631ec0b899SSakari Ailus my $args = []; 3641ec0b899SSakari Ailus 3651ec0b899SSakari Ailus my $sp; 3661ec0b899SSakari Ailus 3671ec0b899SSakari Ailus ($name, $addr, $args) = name_split($name, $addr) if /\(.*\)/; 3681ec0b899SSakari Ailus 3691ec0b899SSakari Ailus $name =~ s/[,\.-]/_/g; 3701ec0b899SSakari Ailus 3711ec0b899SSakari Ailus my $flagstring = ""; 3721ec0b899SSakari Ailus my $size = elem_size(@flags); 3731ec0b899SSakari Ailus $flagstring .= "| CCS_FL_16BIT " if $size eq "2"; 3741ec0b899SSakari Ailus $flagstring .= "| CCS_FL_32BIT " if $size eq "4"; 3751ec0b899SSakari Ailus $flagstring .= "| CCS_FL_FLOAT_IREAL " if grep /^float_ireal$/, @flags; 3761ec0b899SSakari Ailus $flagstring .= "| CCS_FL_IREAL " if grep /^ireal$/, @flags; 3771ec0b899SSakari Ailus $flagstring =~ s/^\| //; 3781ec0b899SSakari Ailus $flagstring =~ s/ $//; 3791ec0b899SSakari Ailus $flagstring = "($flagstring)" if $flagstring =~ /\|/; 3801ec0b899SSakari Ailus my $base_addr = $addr; 3811ec0b899SSakari Ailus $addr = "($addr | $flagstring)" if $flagstring ne ""; 3821ec0b899SSakari Ailus 3831ec0b899SSakari Ailus my $arglist = @$args ? "(" . (join ", ", @$args) . ")" : ""; 3841ec0b899SSakari Ailus $hdr_data .= sprintf "#define %-62s %s\n", "CCS_R_" . (uc $name), $addr 3851ec0b899SSakari Ailus if !@$args; 3861ec0b899SSakari Ailus 3871ec0b899SSakari Ailus $name =~ s/\(.*//; 3881ec0b899SSakari Ailus 3891ec0b899SSakari Ailus %this = ( name => $name, 3901ec0b899SSakari Ailus addr => $addr, 3911ec0b899SSakari Ailus base_addr => $base_addr, 3921ec0b899SSakari Ailus argparams => {}, 3931ec0b899SSakari Ailus args => $args, 3941ec0b899SSakari Ailus arglist => $arglist, 3951ec0b899SSakari Ailus elsize => $size, 3961ec0b899SSakari Ailus ); 3971ec0b899SSakari Ailus 3981ec0b899SSakari Ailus if (!@$args) { 3991ec0b899SSakari Ailus $reglist .= "\t{ CCS_R_" . (uc $name) . ", 1, 0, \"" . (lc $name) . "\", NULL },\n"; 4001ec0b899SSakari Ailus print $H tabconv $hdr_data; 4011ec0b899SSakari Ailus undef $hdr_data; 4021ec0b899SSakari Ailus 4031ec0b899SSakari Ailus print $LC tabconv sprintf "\t{ CCS_R_" . (uc $name) . ", " . 4041ec0b899SSakari Ailus $this{elsize} . ", 0, \"$name\" },\n" 4051ec0b899SSakari Ailus if is_limit_reg $this{base_addr}; 4061ec0b899SSakari Ailus } 4071ec0b899SSakari Ailus 4081ec0b899SSakari Ailus print $LH tabconv sprintf "#define %-63s%s\n", 4091ec0b899SSakari Ailus "CCS_L_" . (uc $this{name}), $limitcount++ 4101ec0b899SSakari Ailus if is_limit_reg $this{base_addr}; 4111ec0b899SSakari Ailus} 4121ec0b899SSakari Ailus 4131ec0b899SSakari Ailusif (defined $A) { 4141ec0b899SSakari Ailus print $A $argdescs, $reglist; 4151ec0b899SSakari Ailus 4161ec0b899SSakari Ailus print $A "\t{ 0 }\n"; 4171ec0b899SSakari Ailus 4181ec0b899SSakari Ailus print $A "};\n"; 4191ec0b899SSakari Ailus} 4201ec0b899SSakari Ailus 4211ec0b899SSakari Ailusprint $H "\n#endif /* __${uc_header}__ */\n"; 4221ec0b899SSakari Ailus 4231ec0b899SSakari Ailusprint $LH tabconv sprintf "#define %-63s%s\n", "CCS_L_LAST", $limitcount; 4241ec0b899SSakari Ailus 4251ec0b899SSakari Ailusprint $LH "\n#endif /* __${uc_limith}__ */\n"; 4261ec0b899SSakari Ailus 4271ec0b899SSakari Ailusprint $LC "\t{ 0 } /* Guardian */\n"; 4281ec0b899SSakari Ailusprint $LC "};\n"; 4291ec0b899SSakari Ailus 4301ec0b899SSakari Ailusclose($R); 4311ec0b899SSakari Ailusclose($H); 4321ec0b899SSakari Ailusclose($A) if defined $A; 4331ec0b899SSakari Ailusclose($LC); 4341ec0b899SSakari Ailusclose($LH); 435