1#! /bin/sh
2# Generate CGEN simulator files.
3#
4# Usage: /bin/sh cgen.sh {"arch"|"cpu"|"decode"|"defs"|"cpu-decode"} \
5#	srcdir cgen cgendir cgenflags \
6#	arch archflags cpu mach suffix archfile extrafiles opcfile
7#
8# We store the generated files in the source directory until we decide to
9# ship a Scheme interpreter (or other implementation) with gdb/binutils.
10# Maybe we never will.
11
12# We want to behave like make, any error forces us to stop.
13set -e
14
15action=$1
16srcdir=$2
17cgen="$3"
18cgendir=$4
19cgenflags=$5
20arch=$6
21archflags=$7
22cpu=$8
23isa=$9
24# portably bring parameters beyond $9 into view
25shift ; mach=$9
26shift ; suffix=$9
27shift ; archfile=$9
28shift ; extrafiles=$9
29shift ; opcfile=$9
30
31rootdir=${srcdir}/../..
32
33test -z "${opcfile}" && opcfile=/dev/null
34
35if test -z "$isa" ; then
36  isa=all
37  prefix=$cpu
38else
39  prefix=${cpu}_$isa
40fi
41
42lowercase='abcdefghijklmnopqrstuvwxyz'
43uppercase='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
44ARCH=`echo ${arch} | tr "${lowercase}" "${uppercase}"`
45CPU=`echo ${cpu} | tr "${lowercase}" "${uppercase}"`
46PREFIX=`echo ${prefix} | tr "${lowercase}" "${uppercase}"`
47
48sedscript="\
49-e s/@ARCH@/${ARCH}/g -e s/@arch@/${arch}/g \
50-e s/@CPU@/${CPU}/g -e s/@cpu@/${cpu}/g \
51-e s/@PREFIX@/${PREFIX}/g -e s/@prefix@/${prefix}/g"
52
53case $action in
54arch)
55	rm -f tmp-arch.h1 tmp-arch.h
56	rm -f tmp-arch.c1 tmp-arch.c
57	rm -f tmp-all.h1 tmp-all.h
58
59	${cgen} ${cgendir}/cgen-sim.scm \
60		-s ${cgendir} \
61		${cgenflags} \
62		-f "${archflags}" \
63		-m ${mach} \
64		-a ${archfile} \
65		-i ${isa} \
66		-A tmp-arch.h1 \
67		-B tmp-arch.c1 \
68		-N tmp-all.h1
69	sed $sedscript < tmp-arch.h1 > tmp-arch.h
70	${rootdir}/move-if-change tmp-arch.h ${srcdir}/arch.h
71	sed $sedscript < tmp-arch.c1 > tmp-arch.c
72	${rootdir}/move-if-change tmp-arch.c ${srcdir}/arch.c
73	sed $sedscript < tmp-all.h1 > tmp-all.h
74	${rootdir}/move-if-change tmp-all.h ${srcdir}/cpuall.h
75
76	rm -f tmp-arch.h1 tmp-arch.c1 tmp-all.h1
77	;;
78
79cpu | decode | cpu-decode)
80
81	fileopts=""
82	case $action in
83	*cpu*)
84		rm -f tmp-cpu.h1 tmp-cpu.c1
85		rm -f tmp-ext.c1 tmp-read.c1 tmp-write.c1
86		rm -f tmp-sem.c1 tmp-semsw.c1
87		rm -f tmp-mod.c1
88		rm -f tmp-cpu.h tmp-cpu.c
89		rm -f tmp-ext.c tmp-read.c tmp-write.c
90		rm -f tmp-sem.c tmp-semsw.c tmp-mod.c
91		fileopts="$fileopts \
92			-C tmp-cpu.h1 \
93			-U tmp-cpu.c1 \
94			-M tmp-mod.c1 \
95			${extrafiles}"
96		;;
97	esac
98	case $action in
99	*decode*)
100		rm -f tmp-dec.h1 tmp-dec.h tmp-dec.c1 tmp-dec.c
101		fileopts="$fileopts \
102			-T tmp-dec.h1 \
103			-D tmp-dec.c1"
104		case "$extrafiles" in
105		  ignored) # Do nothing.
106			   ;;
107		  *)       fileopts="$fileopts $extrafiles"
108			   ;;
109		esac
110		;;
111	esac
112
113	${cgen} ${cgendir}/cgen-sim.scm \
114		-s ${cgendir} \
115		${cgenflags} \
116		-f "${archflags}" \
117		-m ${mach} \
118		-a ${archfile} \
119		-i ${isa} \
120		${fileopts}
121
122	case $action in
123	*cpu*)
124		sed $sedscript < tmp-cpu.h1 > tmp-cpu.h
125		${rootdir}/move-if-change tmp-cpu.h ${srcdir}/cpu${suffix}.h
126		sed $sedscript < tmp-cpu.c1 > tmp-cpu.c
127		${rootdir}/move-if-change tmp-cpu.c ${srcdir}/cpu${suffix}.c
128		sed $sedscript < tmp-mod.c1 > tmp-mod.c
129		${rootdir}/move-if-change tmp-mod.c ${srcdir}/model${suffix}.c
130		if test -f tmp-ext.c1 ; then \
131			sed $sedscript < tmp-ext.c1 > tmp-ext.c ; \
132			${rootdir}/move-if-change tmp-ext.c ${srcdir}/extract${suffix}.c ; \
133		fi
134		if test -f tmp-read.c1 ; then \
135			sed $sedscript < tmp-read.c1 > tmp-read.c ; \
136			${rootdir}/move-if-change tmp-read.c ${srcdir}/read${suffix}.c ; \
137		fi
138		if test -f tmp-write.c1 ; then \
139			sed $sedscript < tmp-write.c1 > tmp-write.c ; \
140			${rootdir}/move-if-change tmp-write.c ${srcdir}/write${suffix}.c ; \
141		fi
142		if test -f tmp-sem.c1 ; then \
143			sed $sedscript < tmp-sem.c1 > tmp-sem.c ; \
144			${rootdir}/move-if-change tmp-sem.c ${srcdir}/sem${suffix}.c ; \
145		fi
146		if test -f tmp-semsw.c1 ; then \
147			sed $sedscript < tmp-semsw.c1 > tmp-semsw.c ; \
148			${rootdir}/move-if-change tmp-semsw.c ${srcdir}/sem${suffix}-switch.c ; \
149		fi
150
151		rm -f tmp-cpu.h1 tmp-cpu.c1
152		rm -f tmp-ext.c1 tmp-read.c1 tmp-write.c1
153		rm -f tmp-sem.c1 tmp-semsw.c1 tmp-mod.c1
154		;;
155	esac
156
157	case $action in
158	*decode*)
159		sed $sedscript < tmp-dec.h1 > tmp-dec.h
160		${rootdir}/move-if-change tmp-dec.h ${srcdir}/decode${suffix}.h
161		sed $sedscript < tmp-dec.c1 > tmp-dec.c
162		${rootdir}/move-if-change tmp-dec.c ${srcdir}/decode${suffix}.c
163
164		if test -f tmp-sem.c1 ; then \
165			sed $sedscript < tmp-sem.c1 > tmp-sem.c ; \
166			${rootdir}/move-if-change tmp-sem.c ${srcdir}/sem${suffix}.c ; \
167		fi
168		if test -f tmp-semsw.c1 ; then \
169			sed $sedscript < tmp-semsw.c1 > tmp-semsw.c ; \
170			${rootdir}/move-if-change tmp-semsw.c ${srcdir}/sem${suffix}-switch.c ; \
171		fi
172
173		rm -f tmp-dec.h1 tmp-dec.c1
174		;;
175	esac
176
177	;;
178
179defs)
180	rm -f tmp-defs.h1 tmp-defs.h
181	
182	${cgen} ${cgendir}/cgen-sim.scm \
183		-s ${cgendir} \
184		${cgenflags} \
185		-f "${archflags}" \
186		-m ${mach} \
187		-a ${archfile} \
188		-i ${isa} \
189		-G tmp-defs.h1
190	sed $sedscript < tmp-defs.h1 > tmp-defs.h
191	${rootdir}/move-if-change tmp-defs.h ${srcdir}/defs${suffix}.h
192	;;
193
194desc)
195	rm -f tmp-desc.h1 tmp-desc.h
196	rm -f tmp-desc.c1 tmp-desc.c
197	rm -f tmp-opc.h1 tmp-opc.h
198
199	${cgen} ${cgendir}/cgen-opc.scm \
200		-s ${cgendir} \
201		${cgenflags} \
202		-OPC ${opcfile} \
203		-f "${archflags}" \
204		-m ${mach} \
205		-a ${archfile} \
206		-i ${isa} \
207		-H tmp-desc.h1 \
208		-C tmp-desc.c1 \
209		-O tmp-opc.h1
210	sed $sedscript < tmp-desc.h1 > tmp-desc.h
211	${rootdir}/move-if-change tmp-desc.h ${srcdir}/${arch}-desc.h
212	sed $sedscript < tmp-desc.c1 > tmp-desc.c
213	${rootdir}/move-if-change tmp-desc.c ${srcdir}/${arch}-desc.c
214	sed $sedscript < tmp-opc.h1 > tmp-opc.h
215	${rootdir}/move-if-change tmp-opc.h ${srcdir}/${arch}-opc.h
216
217	rm -f tmp-desc.h1 tmp-desc.c1 tmp-opc.h1
218	;;
219
220*)
221	echo "`basename $0`: unknown action: ${action}" >&2
222	exit 1
223	;;
224
225esac
226
227exit 0
228