This commit is contained in:
parent
df555b5de6
commit
a123e60633
|
@ -0,0 +1 @@
|
|||
SUBDIRS = src man1
|
|
@ -0,0 +1,48 @@
|
|||
dnl
|
||||
dnl This file is part of the Alliance CAD System
|
||||
dnl Copyright (C) Laboratoire LIP6 - Département ASIM
|
||||
dnl Universite Pierre et Marie Curie
|
||||
dnl
|
||||
dnl Home page : http://www-asim.lip6.fr/alliance/
|
||||
dnl E-mail support : mailto:alliance-support@asim.lip6.fr
|
||||
dnl
|
||||
dnl This library is free software; you can redistribute it and/or modify it
|
||||
dnl under the terms of the GNU Library General Public License as published
|
||||
dnl by the Free Software Foundation; either version 2 of the License, or (at
|
||||
dnl your option) any later version.
|
||||
dnl
|
||||
dnl Alliance VLSI CAD System is distributed in the hope that it will be
|
||||
dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
dnl Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public License along
|
||||
dnl with the GNU C Library; see the file COPYING. If not, write to the Free
|
||||
dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
dnl
|
||||
dnl Purpose : Auto stuffing Alliance
|
||||
dnl Almost ten years since I wrote this stuff, I just can't
|
||||
dnl believe it
|
||||
dnl Date : 01/02/2002
|
||||
dnl Author : Frederic Petrot <Frederic.Petrot@lip6.fr>
|
||||
dnl $Id: configure.in,v 1.1 2002/04/04 15:44:22 ludo Exp $
|
||||
dnl
|
||||
dnl
|
||||
AC_INIT(src/vh_simulad.c)
|
||||
AM_INIT_AUTOMAKE(asimut, 3.2)
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_CC
|
||||
AC_PROG_YACC
|
||||
AM_PROG_LEX
|
||||
AC_HEADER_STDC
|
||||
AC_CHECK_HEADERS(strings.h unistd.h)
|
||||
AC_C_CONST
|
||||
AC_PROG_RANLIB
|
||||
|
||||
AM_ALLIANCE
|
||||
|
||||
AC_OUTPUT([
|
||||
Makefile
|
||||
src/Makefile
|
||||
man1/Makefile
|
||||
])
|
|
@ -0,0 +1,2 @@
|
|||
man_MANS = asimut.1
|
||||
EXTRA_DIST = $(man_MANS)
|
|
@ -0,0 +1,200 @@
|
|||
.\" $Id: asimut.1,v 1.1 2002/04/04 15:44:24 ludo Exp $
|
||||
.\" @(#)asimut.1 1.92 Nov 30 1995 UPMC; Pirouz BAZARGAN SABET
|
||||
.TH ASIMUT 1 "October 1, 1997" "ASIM/LIP6" "cao\-vlsi reference manual"
|
||||
|
||||
.SH NAME
|
||||
.PP
|
||||
\fBasimut\fP \- A simulation tool for hardware descriptions
|
||||
|
||||
.so man1/alc_origin.1
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
asimut \fI[options] [root_file] [pattern_file] [result_file]\fP
|
||||
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
\fBasimut\fP is a logical simulation tool for hardware descriptions. It
|
||||
compiles and loads a complete hardware description written in VHDL (Very
|
||||
high speed integrated circuits Hardware Description Language). The hardware
|
||||
description may be structural (a hierarchy of instances) or behavioural.
|
||||
Only a subset of VHDL is supported. Descriptions that do not
|
||||
match this subset cause a syntax error during compilation. See \fBvhdl(5)\fP
|
||||
for detailed information about the supported subset of VHDL.
|
||||
|
||||
.PP
|
||||
Once a hardware description is loaded, \fBasimut\fP looks for a simulation
|
||||
pattern description file. This file is to be written in \fBpat\fP format.
|
||||
The file is compiled, loaded and linked with the hardware description. Then,
|
||||
the simulation is started. When patterns are processed, a result file in
|
||||
\fBpat\fP format is produced.
|
||||
|
||||
.PP
|
||||
If a save action has been requested in the pattern description file (see
|
||||
\fBpat (5)\fP), \fBasimut\fP creates also a save file representing the state
|
||||
of the description at the end of the simulation of the last pattern. The save
|
||||
file is named \fIroot_file\fP.sav, where \fIroot_file\fP is the name of the
|
||||
description.
|
||||
|
||||
.PP
|
||||
The save file can be used in a later simulation sequence to initialize the
|
||||
state of the (same) hardware description before the simulation begins.
|
||||
Using this mechanism, a large sequence of patterns can be breaked onto
|
||||
several small sequences, each one initializing the hardware description with
|
||||
the save file resulted from the previous sequence.
|
||||
|
||||
.PP
|
||||
\fBasimut\fP reads several parameters from the environment variables :
|
||||
|
||||
.TP 20
|
||||
\fIMBK_CATA_LIB\fP
|
||||
list of directories containing description and pattern files (using $PATH
|
||||
syntax). The default path is the current directory (see mbk(1)).
|
||||
.TP 20
|
||||
\fIMBK_WORK_LIB\fP
|
||||
specifies the current working directory. The working directory idicates the
|
||||
place where all output files are written.
|
||||
.TP 20
|
||||
\fIMBK_CATAL_NAME\fP
|
||||
Indicates the file where the behavioral description files are listed. This
|
||||
file is used to leaf cells of a structural description.(see mbk(1))
|
||||
.TP 20
|
||||
\fIMBK_IN_LO\fP
|
||||
file extension for structural entity. (see mbk(1))
|
||||
.TP 20
|
||||
\fIVH_BEHSFX\fP
|
||||
list of file extensions for behavioural entities (using $PATH syntax). The
|
||||
default file extension is \fBvbe\fP.
|
||||
.TP 20
|
||||
\fIVH_PATSFX\fP
|
||||
list of file extensions for pattern description entities (using $PATH syntax).
|
||||
The default file extension is \fBpat\fP.
|
||||
.TP 20
|
||||
\fIVH_DLYSFX\fP
|
||||
list of file extensions for delays description entities (using $PATH syntax).
|
||||
The default file extension is \fBdly\fP.
|
||||
.TP 20
|
||||
\fIVH_MAXERR\fP
|
||||
maximum number of errors allowed during simulation phase. If the number of
|
||||
errors occured during simulation reaches VH_MAXERR, \fBasimut\fP stops
|
||||
the simulation at the end of processing the current pattern. Patterns following
|
||||
the current pattern remain unprocessed and are reproduced in the result file.
|
||||
The default value of \fIVH_MAXERR\fP is 10.
|
||||
|
||||
.PP
|
||||
\fIroot_file\fP is the name of the description.
|
||||
|
||||
.PP
|
||||
By default \fBasimut\fP looks for a structural description. It uses the
|
||||
\fIMBK_IN_LO\fP environment variables to identify both the format and the
|
||||
extension of structural description files. To load structural VHDL files
|
||||
\fIMBK_IN_LO\fP must be set to \fBvst\fP.
|
||||
|
||||
.PP
|
||||
To load a pure behavioural description \fB\-b\fP option must be specified. In
|
||||
such a case \fBasimut\fP loads a data flow VHDL description file. The
|
||||
\fIVH_BEHSFX\fP environment variable gives the extensions to be used.
|
||||
|
||||
.PP
|
||||
\fIpattern_file\fP is the entity name of the pattern description. The file
|
||||
containing this entity must be named \fIpattern_file.ext\fP , where \fIext\fP
|
||||
is one of the extension specified in \fIVH_PATSFX\fP.
|
||||
|
||||
.PP
|
||||
\fIresult_file\fP is the result file produced by \fBasimut\fP. The result file
|
||||
is a pattern description file with the extension specified by \fIVH_PATSFX\fP.
|
||||
|
||||
.SH OPTIONS
|
||||
.TP 20
|
||||
\fI\-b\fP
|
||||
consider the \fIroot_file\fP description as a behavioural description
|
||||
.TP 20
|
||||
\fI\-backdelay [min, max, typ] delay_file\fP
|
||||
use file \fIdelay_file.ext\fP for delays backannotation, where \fIext\fP
|
||||
is one of the extension specified in \fIVH_DLYSFX\fP.
|
||||
.TP 20
|
||||
\fI\-bdd\fP
|
||||
use BDDs (Binary Decision Diagram) to represent expressions. Using this option
|
||||
makes the simulation be two times faster but increases memory requirement
|
||||
.TP 20
|
||||
\fI\-c\fP
|
||||
run only the compilation stage
|
||||
.TP 20
|
||||
\fI\-core core_file\fP
|
||||
at the first error encountered, dump the state of the circuit in both an
|
||||
ascii file (suffixed .cor) and a binary save file (suffixed .sav) which can
|
||||
be used as initialization file in a further session. If the \fI\-nores\fP
|
||||
option is specified a pattern file is also produced.
|
||||
.TP 20
|
||||
\fI\-dbg[sbpldc]\fP
|
||||
call the debugger (developper usage)
|
||||
.TP 20
|
||||
\fI\-defaultdelay (\-dd)\fP
|
||||
only null delays (no after clause in the VHDL file) are changed if
|
||||
backannotated delays or fixed delays are specified.
|
||||
.TP 20
|
||||
\fI\-fixeddelay value (\-fd value)\fP
|
||||
all delays of the description are fixed to \fIvalue\fP.
|
||||
.TP 20
|
||||
\fI\-h\fP
|
||||
display this help file
|
||||
.TP 20
|
||||
\fI\-i value\fP
|
||||
initialize all signals of the description with \fIvalue\fP. \fIValue\fP can
|
||||
be 0 or 1
|
||||
.TP 20
|
||||
\fI\-i save_file\fP
|
||||
read a save file and use it to initialize the state of the description before
|
||||
processing the first pattern (the file name cannot be 1 nor 0)
|
||||
.TP 20
|
||||
\fI\-inspect instance_name\fP
|
||||
produce a pattern file corresponding to the interface of the instance
|
||||
identified by \fIinstance-name\fP
|
||||
.TP 20
|
||||
\fI\-l n\fP
|
||||
print at most \fIn\fP characters for pattern labels. The default value for
|
||||
\fIn\fP is 15.
|
||||
.TP 20
|
||||
\fI\-nores\fP
|
||||
do not generate result file
|
||||
.TP 20
|
||||
\fI\-p n\fP
|
||||
load at most \fIn\fP patterns from input pattern file each time. Using this
|
||||
feature reduces memory allocation when a great number of patterns are to be
|
||||
simulated. In addition after the \fIn\fP patterns have been processed, the
|
||||
simulation result is printed in the result pattern file. The default value
|
||||
for \fIn\fP is 0 which makes the whole pattern
|
||||
file be loaded.
|
||||
.TP 20
|
||||
\fI\-t\fP
|
||||
trace signals when making BDDs (developper usage).
|
||||
.TP 20
|
||||
\fI\-transport\fP
|
||||
use transport delay model (default is inertial).
|
||||
.TP 20
|
||||
\fI\-zerodelay (\-zd)\fP
|
||||
all the delays of the VHDL description are supposed to be null delays.
|
||||
|
||||
.SH EXAMPLE
|
||||
.PP
|
||||
asimut \-b \-i init_add adder_32 adder_patterns res_add
|
||||
.PP
|
||||
simulates a behavioural description held in the file named 'adder_32.vbe
|
||||
using the pattern file `adder_patterns.pat'. The simulation results is
|
||||
written into 'res_add.pat' and the description is initialized with the
|
||||
values contained in 'init_add.sav'.
|
||||
|
||||
.SH DIAGNOSTICS
|
||||
.PP
|
||||
Register initializations in the pattern file allows changing the value of
|
||||
a register into a known value. However, using this feature to initialize a
|
||||
register before executing the first pattern is not recommended. Registers
|
||||
value (defined by the initialization statement) may be overwritten since
|
||||
description has not a coherent state before the first pattern.
|
||||
|
||||
.SH SEE ALSO
|
||||
.PP
|
||||
vhdl(5), pat(5), genpat(1), mbk(1)
|
||||
|
||||
|
||||
.so man1/alc_bug_report.1
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
CFLAGS = @ALLIANCE_CFLAGS@
|
||||
|
||||
lib_LIBRARIES = libCst.a libSch.a
|
||||
include_HEADERS = cst.h sch.h
|
||||
|
||||
libCst_a_SOURCES = \
|
||||
cst_AddSetElt.c cst_error.c cst_globals.c \
|
||||
cst_CrtCompSet.c cst_GetFirstElt.c cst.h \
|
||||
cst_CrtInterSet.c cst_GetLastElt.c cst_IsInSetElt.c \
|
||||
cst_CrtUnionSet.c cst_GetNextElt.c cst_RemSetElt.c \
|
||||
cst_DisjunctSet.c cst_GetPrevElt.c cst_SetCmp.c
|
||||
|
||||
|
||||
libSch_a_SOURCES = \
|
||||
sch_addshent.c sch_CrtSch.c sch_GetCTim.c sch.h sch_rmventry.c \
|
||||
sch_addshtra.c sch_debug.c sch_GetCTra.c sch_hash.c sch_SetCTim.c \
|
||||
sch_addshwav.c sch_debug.h sch_GetNTim.c sch_insentry.c \
|
||||
sch_AddTra.c sch_error.c sch_globals.c sch_inswave.c \
|
||||
sch_bug.c sch_Free.c sch_GoNTim.c sch_message.c
|
||||
|
||||
bin_PROGRAMS = asimut
|
||||
|
||||
asimut_LDADD = @ALLIANCE_LIBS@ \
|
||||
-L. -lMlu -lMal -lMcl -lMel -lMhl -lMgl -lMsl -lMvl -lMlo -lRcn \
|
||||
-lBvl -lBhl -lBeh -lPpt -lPhl -lPat -lSch -lLog -lMut
|
||||
|
||||
asimut_SOURCES = \
|
||||
beh_delay.h c_fsyn_sr1k_56.c vh_debug.c vh_lspec.c vh_util.h \
|
||||
beh_setdelay.c c_fsyn_sr4k_10.c vh_debug.h vh_lspec.h vh_xcomm.c \
|
||||
c_fsyn_sr1k_10.c c_hada_repondeur.c vh_dtype.h vh_ltype.h vh_xcomm.h \
|
||||
c_fsyn_sr1k_1.c c_sr1k_8a.c vh_globals.c vh_simulad.c vh_xspec.c \
|
||||
c_fsyn_sr1k_24.c c_sr1k_8b.c vh_globals.h vh_simulad.h vh_xspec.h \
|
||||
c_fsyn_sr1k_4.c c_sr8k_8a.c vh_init.c vh_util.c
|
||||
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : beh_delay.h */
|
||||
/* date : Oct 30 1995 */
|
||||
/* version : v109 */
|
||||
/* author : Pirouz BAZARGAN SABET & Julien DUNOYER */
|
||||
/* contents : defines delay definitions used in BEH library */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* defines */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
#define BEH_DELAY_FIXED 0x01 /* Fixed delay behavior */
|
||||
#define BEH_DELAY_RANDOM 0x02 /* Random delay behavior */
|
||||
#define BEH_DELAY_BACKANOTATED 0x04 /* Backanotated delay behavior */
|
||||
#define BEH_DELAY_BUFREG 0x08 /* Add Buffer delay after reg */
|
||||
#define BEH_DELAY_DEFAULT 0x10 /* Default delay behavior */
|
||||
#define BEH_DELAY_MIN 0x20 /* Minimum delay mode */
|
||||
#define BEH_DELAY_MAX 0x40 /* Maximum delay mode */
|
||||
#define BEH_DELAY_TYP 0x80 /* Typical delay mode */
|
||||
|
||||
#define BEH_DELAY_FIELD 7 /* delay dico field */
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,124 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : c_fsyn_sr1k_1.c */
|
||||
/* date : Jun 3 1997 */
|
||||
/* version : v2.02 */
|
||||
/* author : Pirouz Bazargan Sabet */
|
||||
/* content : C model of a circuit */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "vh_ltype.h"
|
||||
#include "vh_xcomm.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : c_fsyn_sr1k_1 */
|
||||
/* description : 1K synchronous (clock's falling edge) static 1-bit */
|
||||
/* Ram */
|
||||
/* called func. : vhx_getvalu, vhx_readinput, vhx_writebus */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void c_fsyn_sr1k_1 (pt_lkdins)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
|
||||
{
|
||||
char ck ; /* clock */
|
||||
unsigned int d_out ; /* output 1-bit data */
|
||||
unsigned int d_in ; /* input 1-bit data */
|
||||
unsigned int adr ; /* 10-bit address */
|
||||
char oe ; /* output enable */
|
||||
char we ; /* write enable */
|
||||
|
||||
#define POSI_we 0
|
||||
#define POSI_oe POSI_we + 1
|
||||
#define POSI_adr POSI_oe + 1
|
||||
#define POSI_d_in POSI_adr + 10
|
||||
#define POSI_ck POSI_d_in + 1
|
||||
|
||||
#define POSO_d_out 0
|
||||
|
||||
struct local_mem
|
||||
{
|
||||
unsigned int LAST_CK ;
|
||||
unsigned char RAM [1024];
|
||||
};
|
||||
|
||||
struct local_mem *local ;
|
||||
static void init () ;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* get the memory space reserved for the current instance */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhx_getvalu (pt_lkdins, &local, sizeof(struct local_mem), init);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the current value of input signals (ck) */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
ck = vhx_readinput (pt_lkdins, POSI_ck, 1);
|
||||
|
||||
if (ck == 1)
|
||||
local->LAST_CK = 1;
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* check for the falling edge of the clock */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (local->LAST_CK == 1)
|
||||
{
|
||||
local->LAST_CK = 0;
|
||||
|
||||
oe = vhx_readinput (pt_lkdins, POSI_oe , 1);
|
||||
we = vhx_readinput (pt_lkdins, POSI_we , 1);
|
||||
adr = vhx_readinput (pt_lkdins, POSI_adr , 10);
|
||||
|
||||
if (we == 1)
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* write the input data into the ram */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
d_in = vhx_readinput (pt_lkdins, POSI_d_in, 1);
|
||||
local->RAM [adr] = d_in;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the content of the ram and write the result into the */
|
||||
/* projected value of ouput data */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (oe == 1)
|
||||
d_out = local->RAM [adr];
|
||||
else
|
||||
d_out = 0;
|
||||
|
||||
vhx_writeout (d_out, pt_lkdins, POSO_d_out, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : init */
|
||||
/* description : initializations */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void init (pt_lkdins, pt_mem)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
char *pt_mem ;
|
||||
|
||||
{
|
||||
char *name;
|
||||
|
||||
name = vhx_GetInstanceName (pt_lkdins);
|
||||
printf ("coucou %s\n", name);
|
||||
}
|
|
@ -0,0 +1,124 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : c_fsyn_sr1k_10.c */
|
||||
/* date : Jun 3 1997 */
|
||||
/* version : v2.02 */
|
||||
/* author : Pirouz Bazargan Sabet */
|
||||
/* content : C model of a circuit */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "vh_ltype.h"
|
||||
#include "vh_xcomm.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : c_fsyn_sr1k_10 */
|
||||
/* description : 1K synchronous (clock's falling edge) static 10-bit */
|
||||
/* Ram */
|
||||
/* called func. : vhx_getvalu, vhx_readinput, vhx_writebus */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void c_fsyn_sr1k_10 (pt_lkdins)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
|
||||
{
|
||||
char ck ; /* clock */
|
||||
unsigned int d_out ; /* output 10-bit data */
|
||||
unsigned int d_in ; /* input 10-bit data */
|
||||
unsigned int adr ; /* 10-bit address */
|
||||
char oe ; /* output enable */
|
||||
char we ; /* write enable */
|
||||
|
||||
#define POSI_we 0
|
||||
#define POSI_oe POSI_we + 1
|
||||
#define POSI_adr POSI_oe + 1
|
||||
#define POSI_d_in POSI_adr + 10
|
||||
#define POSI_ck POSI_d_in + 10
|
||||
|
||||
#define POSO_d_out 0
|
||||
|
||||
struct local_mem
|
||||
{
|
||||
unsigned int LAST_CK ;
|
||||
unsigned short RAM [1024];
|
||||
};
|
||||
|
||||
struct local_mem *local ;
|
||||
static void init () ;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* get the memory space reserved for the current instance */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhx_getvalu (pt_lkdins, &local, sizeof(struct local_mem), init);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the current value of input signals (ck) */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
ck = vhx_readinput (pt_lkdins, POSI_ck, 1);
|
||||
|
||||
if (ck == 1)
|
||||
local->LAST_CK = 1;
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* check for the falling edge of the clock */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (local->LAST_CK == 1)
|
||||
{
|
||||
local->LAST_CK = 0;
|
||||
|
||||
oe = vhx_readinput (pt_lkdins, POSI_oe , 1);
|
||||
we = vhx_readinput (pt_lkdins, POSI_we , 1);
|
||||
adr = vhx_readinput (pt_lkdins, POSI_adr , 10);
|
||||
|
||||
if (we == 1)
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* write the input data into the ram */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
d_in = vhx_readinput (pt_lkdins, POSI_d_in, 10);
|
||||
local->RAM [adr] = d_in;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the content of the ram and write the result into the */
|
||||
/* projected value of ouput data */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (oe == 1)
|
||||
d_out = local->RAM [adr];
|
||||
else
|
||||
d_out = 0;
|
||||
|
||||
vhx_writeout (d_out, pt_lkdins, POSO_d_out, 10);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : init */
|
||||
/* description : initializations */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void init (pt_lkdins, pt_mem)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
char *pt_mem ;
|
||||
|
||||
{
|
||||
char *name;
|
||||
|
||||
name = vhx_GetInstanceName (pt_lkdins);
|
||||
printf ("coucou %s\n", name);
|
||||
}
|
|
@ -0,0 +1,125 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : c_fsyn_sr1k_24.c */
|
||||
/* date : Jun 3 1997 */
|
||||
/* version : v2.02 */
|
||||
/* author : Pirouz Bazargan Sabet */
|
||||
/* content : C model of a circuit */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "vh_ltype.h"
|
||||
#include "vh_xcomm.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : c_fsyn_sr1k_24 */
|
||||
/* description : 1K synchronous (clock's falling edge) static 24-bit */
|
||||
/* Ram */
|
||||
/* called func. : vhx_getvalu, vhx_readinput, vhx_writebus */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void c_fsyn_sr1k_24 (pt_lkdins)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
|
||||
{
|
||||
char ck ; /* clock */
|
||||
unsigned int d_out ; /* output 24-bit data */
|
||||
unsigned int d_in ; /* input 24-bit data */
|
||||
unsigned int adr ; /* 10-bit address */
|
||||
char oe ; /* output enable */
|
||||
char we ; /* write enable */
|
||||
|
||||
#define POSI_we 0
|
||||
#define POSI_oe POSI_we + 1
|
||||
#define POSI_adr POSI_oe + 1
|
||||
#define POSI_d_in POSI_adr + 10
|
||||
#define POSI_ck POSI_d_in + 24
|
||||
|
||||
#define POSO_d_out 0
|
||||
|
||||
struct local_mem
|
||||
{
|
||||
unsigned int LAST_CK ;
|
||||
unsigned int RAM [1024];
|
||||
};
|
||||
|
||||
struct local_mem *local ;
|
||||
static void init () ;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* get the memory space reserved for the current instance */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhx_getvalu (pt_lkdins, &local, sizeof(struct local_mem), init);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the current value of input signals (ck) */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
ck = vhx_readinput (pt_lkdins, POSI_ck, 1);
|
||||
|
||||
if (ck == 1)
|
||||
local->LAST_CK = 1;
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* check for the falling edge of the clock */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (local->LAST_CK == 1)
|
||||
{
|
||||
local->LAST_CK = 0;
|
||||
|
||||
oe = vhx_readinput (pt_lkdins, POSI_oe , 1);
|
||||
we = vhx_readinput (pt_lkdins, POSI_we , 1);
|
||||
adr = vhx_readinput (pt_lkdins, POSI_adr , 10);
|
||||
|
||||
if (we == 1)
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* write the input data into the ram */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
d_in = vhx_readinput (pt_lkdins, POSI_d_in, 24);
|
||||
local->RAM [adr] = d_in;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the content of the ram and write the result into the */
|
||||
/* projected value of ouput data */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (oe == 1)
|
||||
d_out = local->RAM [adr];
|
||||
else
|
||||
d_out = 0;
|
||||
|
||||
vhx_writeout (d_out, pt_lkdins, POSO_d_out, 24);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : init */
|
||||
/* description : initializations */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void init (pt_lkdins, pt_mem)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
char *pt_mem ;
|
||||
|
||||
{
|
||||
char *name;
|
||||
|
||||
name = vhx_GetInstanceName (pt_lkdins);
|
||||
printf ("coucou %s\n", name);
|
||||
}
|
|
@ -0,0 +1,124 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : c_fsyn_sr1k_4.c */
|
||||
/* date : Jun 3 1997 */
|
||||
/* version : v2.02 */
|
||||
/* author : Pirouz Bazargan Sabet */
|
||||
/* content : C model of a circuit */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "vh_ltype.h"
|
||||
#include "vh_xcomm.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : c_fsyn_sr1k_4 */
|
||||
/* description : 1K synchronous (clock's falling edge) static 4-bit */
|
||||
/* Ram */
|
||||
/* called func. : vhx_getvalu, vhx_readinput, vhx_writebus */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void c_fsyn_sr1k_4 (pt_lkdins)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
|
||||
{
|
||||
char ck ; /* clock */
|
||||
unsigned int d_out ; /* output 4-bit data */
|
||||
unsigned int d_in ; /* input 4-bit data */
|
||||
unsigned int adr ; /* 10-bit address */
|
||||
char oe ; /* output enable */
|
||||
char we ; /* write enable */
|
||||
|
||||
#define POSI_we 0
|
||||
#define POSI_oe POSI_we + 1
|
||||
#define POSI_adr POSI_oe + 1
|
||||
#define POSI_d_in POSI_adr + 10
|
||||
#define POSI_ck POSI_d_in + 4
|
||||
|
||||
#define POSO_d_out 0
|
||||
|
||||
struct local_mem
|
||||
{
|
||||
unsigned int LAST_CK ;
|
||||
unsigned char RAM [1024];
|
||||
};
|
||||
|
||||
struct local_mem *local ;
|
||||
static void init () ;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* get the memory space reserved for the current instance */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhx_getvalu (pt_lkdins, &local, sizeof(struct local_mem), init);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the current value of input signals (ck) */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
ck = vhx_readinput (pt_lkdins, POSI_ck, 1);
|
||||
|
||||
if (ck == 1)
|
||||
local->LAST_CK = 1;
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* check for the falling edge of the clock */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (local->LAST_CK == 1)
|
||||
{
|
||||
local->LAST_CK = 0;
|
||||
|
||||
oe = vhx_readinput (pt_lkdins, POSI_oe , 1);
|
||||
we = vhx_readinput (pt_lkdins, POSI_we , 1);
|
||||
adr = vhx_readinput (pt_lkdins, POSI_adr , 10);
|
||||
|
||||
if (we == 1)
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* write the input data into the ram */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
d_in = vhx_readinput (pt_lkdins, POSI_d_in, 4);
|
||||
local->RAM [adr] = d_in;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the content of the ram and write the result into the */
|
||||
/* projected value of ouput data */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (oe == 1)
|
||||
d_out = local->RAM [adr];
|
||||
else
|
||||
d_out = 0;
|
||||
|
||||
vhx_writeout (d_out, pt_lkdins, POSO_d_out, 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : init */
|
||||
/* description : initializations */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void init (pt_lkdins, pt_mem)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
char *pt_mem ;
|
||||
|
||||
{
|
||||
char *name;
|
||||
|
||||
name = vhx_GetInstanceName (pt_lkdins);
|
||||
printf ("coucou %s\n", name);
|
||||
}
|
|
@ -0,0 +1,139 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : c_fsyn_sr1k_56.c */
|
||||
/* date : Jun 3 1997 */
|
||||
/* version : v2.02 */
|
||||
/* author : Pirouz Bazargan Sabet */
|
||||
/* content : C model of a circuit */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "vh_ltype.h"
|
||||
#include "vh_xcomm.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : c_fsyn_sr1k_56 */
|
||||
/* description : 1K synchronous (clock's falling edge) static 56-bit */
|
||||
/* Ram */
|
||||
/* called func. : vhx_getvalu, vhx_readinput, vhx_writebus */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void c_fsyn_sr1k_56 (pt_lkdins)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
|
||||
{
|
||||
char ck ; /* clock */
|
||||
unsigned int dh_out ; /* output 24 higher bits data */
|
||||
unsigned int dl_out ; /* output 32 lower bits data */
|
||||
unsigned int dh_in ; /* input 24 higher bits data */
|
||||
unsigned int dl_in ; /* input 32 lower bits data */
|
||||
unsigned int adr ; /* 10-bit address */
|
||||
char oe ; /* output enable */
|
||||
char we ; /* write enable */
|
||||
|
||||
#define POSI_we 0
|
||||
#define POSI_oe POSI_we + 1
|
||||
#define POSI_adr POSI_oe + 1
|
||||
#define POSI_dl_in POSI_adr + 10
|
||||
#define POSI_dh_in POSI_dl_in + 32
|
||||
#define POSI_ck POSI_dh_in + 24
|
||||
|
||||
#define POSO_dl_out 0
|
||||
#define POSO_dh_out POSO_dl_out + 32
|
||||
|
||||
struct local_mem
|
||||
{
|
||||
unsigned int LAST_CK ;
|
||||
unsigned int HI_RAM [1024];
|
||||
unsigned int LO_RAM [1024];
|
||||
};
|
||||
|
||||
struct local_mem *local ;
|
||||
static void init () ;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* get the memory space reserved for the current instance */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhx_getvalu (pt_lkdins, &local, sizeof(struct local_mem), init);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the current value of input signals (ck) */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
ck = vhx_readinput (pt_lkdins, POSI_ck, 1);
|
||||
|
||||
if (ck == 1)
|
||||
local->LAST_CK = 1;
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* check for the falling edge of the clock */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (local->LAST_CK == 1)
|
||||
{
|
||||
local->LAST_CK = 0;
|
||||
|
||||
oe = vhx_readinput (pt_lkdins, POSI_oe , 1);
|
||||
we = vhx_readinput (pt_lkdins, POSI_we , 1);
|
||||
adr = vhx_readinput (pt_lkdins, POSI_adr , 10);
|
||||
|
||||
if (we == 1)
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* write the input data into the ram */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
dl_in = vhx_readinput (pt_lkdins, POSI_dl_in, 32);
|
||||
dh_in = vhx_readinput (pt_lkdins, POSI_dh_in, 24);
|
||||
|
||||
local->HI_RAM [adr] = dh_in;
|
||||
local->LO_RAM [adr] = dl_in;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (oe == 1)
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the content of the ram and write the result into the */
|
||||
/* projected value of ouput data */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
dh_out = local->HI_RAM [adr];
|
||||
dl_out = local->LO_RAM [adr];
|
||||
}
|
||||
else
|
||||
{
|
||||
dh_out = 0;
|
||||
dl_out = 0;
|
||||
}
|
||||
|
||||
vhx_writeout (dh_out, pt_lkdins, POSO_dh_out, 24);
|
||||
vhx_writeout (dl_out, pt_lkdins, POSO_dl_out, 32);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : init */
|
||||
/* description : initializations */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void init (pt_lkdins, pt_mem)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
char *pt_mem ;
|
||||
|
||||
{
|
||||
char *name;
|
||||
|
||||
name = vhx_GetInstanceName (pt_lkdins);
|
||||
printf ("coucou %s\n", name);
|
||||
}
|
|
@ -0,0 +1,124 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : c_fsyn_sr4k_10.c */
|
||||
/* date : Jun 3 1997 */
|
||||
/* version : v2.02 */
|
||||
/* author : Pirouz Bazargan Sabet */
|
||||
/* content : C model of a circuit */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "vh_ltype.h"
|
||||
#include "vh_xcomm.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : c_fsyn_sr4k_10 */
|
||||
/* description : 4K synchronous (clock's falling edge) static 10-bit */
|
||||
/* Ram */
|
||||
/* called func. : vhx_getvalu, vhx_readinput, vhx_writebus */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void c_fsyn_sr4k_10 (pt_lkdins)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
|
||||
{
|
||||
char ck ; /* clock */
|
||||
unsigned int d_out ; /* output 10-bit data */
|
||||
unsigned int d_in ; /* input 10-bit data */
|
||||
unsigned int adr ; /* 12-bit address */
|
||||
char oe ; /* output enable */
|
||||
char we ; /* write enable */
|
||||
|
||||
#define POSI_we 0
|
||||
#define POSI_oe POSI_we + 1
|
||||
#define POSI_adr POSI_oe + 1
|
||||
#define POSI_d_in POSI_adr + 12
|
||||
#define POSI_ck POSI_d_in + 10
|
||||
|
||||
#define POSO_d_out 0
|
||||
|
||||
struct local_mem
|
||||
{
|
||||
unsigned int LAST_CK ;
|
||||
unsigned short RAM [4096];
|
||||
};
|
||||
|
||||
struct local_mem *local ;
|
||||
static void init () ;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* get the memory space reserved for the current instance */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhx_getvalu (pt_lkdins, &local, sizeof(struct local_mem), init);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the current value of input signals (ck) */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
ck = vhx_readinput (pt_lkdins, POSI_ck, 1);
|
||||
|
||||
if (ck == 1)
|
||||
local->LAST_CK = 1;
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* check for the falling edge of the clock */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (local->LAST_CK == 1)
|
||||
{
|
||||
local->LAST_CK = 0;
|
||||
|
||||
oe = vhx_readinput (pt_lkdins, POSI_oe , 1);
|
||||
we = vhx_readinput (pt_lkdins, POSI_we , 1);
|
||||
adr = vhx_readinput (pt_lkdins, POSI_adr , 12);
|
||||
|
||||
if (we == 1)
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* write the input data into the ram */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
d_in = vhx_readinput (pt_lkdins, POSI_d_in, 10);
|
||||
local->RAM [adr] = d_in;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the content of the ram and write the result into the */
|
||||
/* projected value of ouput data */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (oe == 1)
|
||||
d_out = local->RAM [adr];
|
||||
else
|
||||
d_out = 0;
|
||||
|
||||
vhx_writeout (d_out, pt_lkdins, POSO_d_out, 10);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : init */
|
||||
/* description : initializations */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void init (pt_lkdins, pt_mem)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
char *pt_mem ;
|
||||
|
||||
{
|
||||
char *name;
|
||||
|
||||
name = vhx_GetInstanceName (pt_lkdins);
|
||||
printf ("coucou %s\n", name);
|
||||
}
|
|
@ -0,0 +1,166 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : c_hada_repondeur.c */
|
||||
/* date : Nov 18 1997 */
|
||||
/* author : Sebatien Lozac'h */
|
||||
/* content : C model of hadamard's test bench */
|
||||
/* warning : This model can only be instancied once */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
|
||||
#include "vh_ltype.h"
|
||||
#include "vh_xspec.h"
|
||||
|
||||
#define MAX 64
|
||||
#define ENTREE "fic_entree"
|
||||
#define ENTREE2 "fic_entree2"
|
||||
#define SORTIE "fic_sortie"
|
||||
|
||||
|
||||
void c_hada_repondeur (pt_lkdins)
|
||||
struct lkdins *pt_lkdins;
|
||||
|
||||
{
|
||||
|
||||
#define RMAX 1000
|
||||
#define PROB 900
|
||||
|
||||
static int deja_ouvert=0;
|
||||
static int deja_ouvert2=0;
|
||||
static int nb_entrees=0;
|
||||
static int nb_sorties=0;
|
||||
static int ck_old=0;
|
||||
static int empty_old=0;
|
||||
static int full_old=0;
|
||||
|
||||
static FILE *fouvrir;
|
||||
static FILE *fecrire;
|
||||
|
||||
/*------- Declaration des entrees -----------*/
|
||||
|
||||
char ck ;
|
||||
char reset ;
|
||||
char read ;
|
||||
char write ;
|
||||
int hadout; /* Entree sur 14 bits */
|
||||
char vdd ;
|
||||
char vss ;
|
||||
|
||||
char empty ;
|
||||
char full ;
|
||||
unsigned int data ; /* Sortie sur 8 bits */
|
||||
|
||||
#define POSI_vss 0
|
||||
#define POSI_vdd POSI_vss + 1
|
||||
#define POSI_hadout POSI_vdd + 1
|
||||
#define POSI_write POSI_hadout + 14
|
||||
#define POSI_read POSI_write + 1
|
||||
#define POSI_reset POSI_read + 1
|
||||
#define POSI_ck POSI_reset + 1
|
||||
|
||||
/*------- Declaration des sorties -----------*/
|
||||
|
||||
|
||||
#define POSO_data 0
|
||||
#define POSO_full POSO_data + 8
|
||||
#define POSO_empty POSO_full + 1
|
||||
|
||||
/*------- Affectation des entrees -----------*/
|
||||
|
||||
ck = vhx_readinput (pt_lkdins, POSI_ck , 1);
|
||||
read = vhx_readinput (pt_lkdins, POSI_read , 1);
|
||||
reset = vhx_readinput (pt_lkdins, POSI_reset , 1);
|
||||
write = vhx_readinput (pt_lkdins, POSI_write , 1);
|
||||
hadout = vhx_readinput (pt_lkdins, POSI_hadout, 14);
|
||||
|
||||
/*------- Ouverture des 2 Fichiers -----------*/
|
||||
|
||||
if (deja_ouvert == 0)
|
||||
{
|
||||
if ((fouvrir = fopen (ENTREE,"r")) == NULL)
|
||||
{ fprintf(stderr,"CANNOT OPEN FILE : %s \n", ENTREE);exit (3);}
|
||||
if ( (fecrire=fopen(SORTIE,"w"))== NULL )
|
||||
{ fprintf(stderr,"CANNOT OPEN FILE : %s \n", SORTIE);exit (3);}
|
||||
deja_ouvert = 1;
|
||||
}
|
||||
|
||||
/*------- Description du comportement -----------*/
|
||||
|
||||
if ((ck_old==0) && (ck==1))
|
||||
{
|
||||
if (reset == 1)
|
||||
{
|
||||
nb_entrees=MAX;
|
||||
nb_sorties=0;
|
||||
empty=1;
|
||||
full=0;
|
||||
}
|
||||
else if ((nb_entrees == MAX) && (nb_sorties == 0))
|
||||
{
|
||||
empty=0;
|
||||
full=0;
|
||||
if (fscanf(fouvrir,"%d",&data) == EOF)
|
||||
{
|
||||
rewind(fouvrir);
|
||||
fscanf(fouvrir,"%d",&data);
|
||||
}
|
||||
fprintf(stderr,"NEW INPUT FIFO VALUE : %d\n", data);
|
||||
vhx_writeout(data,pt_lkdins,POSO_data,8);
|
||||
nb_entrees--;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (( (random() % RMAX) > PROB) || ((nb_entrees==0) && (nb_sorties != 0)))
|
||||
{ empty=1; }
|
||||
else
|
||||
{ empty=0; }
|
||||
|
||||
if (( (random() % RMAX) < PROB) || ((nb_sorties==0) && (nb_entrees != 0)))
|
||||
{ full=0; }
|
||||
else
|
||||
{ full=1; }
|
||||
|
||||
if ((empty_old == 0) && (read == 1) && (nb_entrees == 0))
|
||||
{
|
||||
nb_sorties=MAX;
|
||||
}
|
||||
|
||||
if ((empty_old == 0) && (read == 1) && (nb_entrees != 0))
|
||||
{
|
||||
if (fscanf(fouvrir,"%d",&data) == EOF)
|
||||
{
|
||||
rewind(fouvrir);
|
||||
fscanf(fouvrir,"%d",&data);
|
||||
}
|
||||
fprintf(stderr,"NEW INPUT FIFO VALUE : %d\n", data);
|
||||
vhx_writeout(data,pt_lkdins,POSO_data,8);
|
||||
nb_entrees--;
|
||||
}
|
||||
|
||||
if ((full_old == 0) && (write == 1) && (nb_sorties != 0))
|
||||
{
|
||||
fprintf(stderr,"NEW OUPUT FIFO VALUE : %d\n", hadout);
|
||||
fprintf(fecrire,"0x%x\t",hadout);
|
||||
nb_sorties--;
|
||||
if ( (nb_sorties%8) == 0 ) fprintf(fecrire,"\n",hadout);
|
||||
|
||||
if ( (nb_sorties == 0))
|
||||
{
|
||||
nb_entrees=MAX;
|
||||
fprintf(fecrire,"\n",hadout);
|
||||
fflush(fecrire);
|
||||
}
|
||||
}
|
||||
}
|
||||
vhx_writeout(empty,pt_lkdins,POSO_empty,1);
|
||||
vhx_writeout(full,pt_lkdins,POSO_full,1);
|
||||
full_old=full;
|
||||
empty_old=empty;
|
||||
}
|
||||
ck_old=ck;
|
||||
|
||||
}
|
|
@ -0,0 +1,110 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : c_sr1k_8a.c */
|
||||
/* date : Jun 3 1997 */
|
||||
/* version : v2.02 */
|
||||
/* author : Pirouz Bazargan Sabet */
|
||||
/* content : C model of a circuit */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "vh_ltype.h"
|
||||
#include "vh_xcomm.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : c_sr1k_8a */
|
||||
/* description : A 1 KByte static Ram with a chip select pin */
|
||||
/* called func. : vhx_getvalu, vhx_readinput, vhx_writebus */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void c_sr1k_8a (pt_lkdins)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
|
||||
{
|
||||
char e_n ; /* chip select */
|
||||
char w_n ; /* write enable */
|
||||
unsigned int dat ; /* input-output 8-bit data */
|
||||
unsigned int adr ; /* 10-bit address */
|
||||
char vdd ; /* power supply */
|
||||
char vss ; /* power supply */
|
||||
|
||||
#define POSI_vss 0
|
||||
#define POSI_vdd POSI_vss + 1
|
||||
#define POSI_adr POSI_vdd + 1
|
||||
#define POSI_dat POSI_adr + 10
|
||||
#define POSI_w_n POSI_dat + 8
|
||||
#define POSI_e_n POSI_w_n + 1
|
||||
|
||||
#define POSO_dat 0
|
||||
|
||||
unsigned char *mem ;
|
||||
unsigned int cond = 0;
|
||||
static void init () ;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the current value of input signals (e_n) */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
e_n = vhx_readinput (pt_lkdins, POSI_e_n, 1);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the current value of input signals */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (e_n == 0)
|
||||
{
|
||||
w_n = vhx_readinput (pt_lkdins, POSI_w_n, 1);
|
||||
adr = vhx_readinput (pt_lkdins, POSI_adr, 10);
|
||||
dat = vhx_readinput (pt_lkdins, POSI_dat, 8);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* get the memory space reserved for the current instance */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhx_getvalu (pt_lkdins, &mem, 1024, init);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read or write the data from the memory */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (w_n == 0)
|
||||
mem [adr] = dat;
|
||||
else
|
||||
dat = mem [adr];
|
||||
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* write the result into the projected value of ouput signals */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if ((e_n == 0) && (w_n == 1))
|
||||
cond = 0x000000ff;
|
||||
else
|
||||
cond = 0x00000000;
|
||||
|
||||
vhx_writebus (dat, cond, pt_lkdins, POSO_dat, 8);
|
||||
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : init */
|
||||
/* description : initializations */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void init (pt_lkdins, pt_mem)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
char *pt_mem ;
|
||||
|
||||
{
|
||||
char *name;
|
||||
|
||||
name = vhx_GetInstanceName (pt_lkdins);
|
||||
printf ("coucou %s\n", name);
|
||||
}
|
|
@ -0,0 +1,270 @@
|
|||
/*
|
||||
* This file is part of the Alliance CAD System
|
||||
* Copyright (C) Laboratoire LIP6 - Département ASIM
|
||||
* Universite Pierre et Marie Curie
|
||||
*
|
||||
* Home page : http://www-asim.lip6.fr/alliance/
|
||||
* E-mail support : mailto:alliance-support@asim.lip6.fr
|
||||
*
|
||||
* This progam is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* Alliance VLSI CAD System is distributed in the hope that it will be
|
||||
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
* Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with the GNU C Library; see the file COPYING. If not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : c_sr1k_8b.c */
|
||||
/* date : Dec 13 1999 */
|
||||
/* version : v2.03 */
|
||||
/* author : Pirouz Bazargan Sabet */
|
||||
/* content : C model of a circuit */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "vh_ltype.h"
|
||||
#include "vh_lspec.h"
|
||||
#include "vh_xspec.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : c_sr1k_8b */
|
||||
/* description : A 1 KByte static Ram with a chip select pin */
|
||||
/* called func. : vhx_getvalu, vhx_readinput, vhx_writebus */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void c_sr1k_8b (pt_lkdins)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
|
||||
{
|
||||
char e_n ; /* chip select */
|
||||
char w_n ; /* write enable */
|
||||
unsigned int dat ; /* input-output 8-bit data */
|
||||
unsigned int adr ; /* 10-bit address */
|
||||
char vdd ; /* power supply */
|
||||
char vss ; /* power supply */
|
||||
|
||||
#define POSI_vss 0
|
||||
#define POSI_vdd POSI_vss + 1
|
||||
#define POSI_adr POSI_vdd + 1
|
||||
#define POSI_dat POSI_adr + 10
|
||||
#define POSI_w_n POSI_dat + 8
|
||||
#define POSI_e_n POSI_w_n + 1
|
||||
|
||||
#define POSO_dat 0
|
||||
|
||||
unsigned char *mem ;
|
||||
unsigned int cond = 0;
|
||||
static void init () ;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the current value of input signals (e_n) */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
e_n = vhx_readinput (pt_lkdins, POSI_e_n, 1);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the current value of input signals */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (e_n == 0)
|
||||
{
|
||||
w_n = vhx_readinput (pt_lkdins, POSI_w_n, 1);
|
||||
adr = vhx_readinput (pt_lkdins, POSI_adr, 10);
|
||||
dat = vhx_readinput (pt_lkdins, POSI_dat, 8);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* get the memory space reserved for the current instance */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhx_getvalu (pt_lkdins, &mem, 1024, init);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read or write the data from the memory */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (w_n == 0)
|
||||
mem [adr] = dat;
|
||||
else
|
||||
dat = mem [adr];
|
||||
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* write the result into the projected value of ouput signals */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if ((e_n == 0) && (w_n == 1))
|
||||
cond = 0x000000ff;
|
||||
else
|
||||
cond = 0x00000000;
|
||||
|
||||
vhx_writebus (dat, cond, pt_lkdins, POSO_dat, 8);
|
||||
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : init */
|
||||
/* description : initializations */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#define READ_ADR 0
|
||||
#define READ_VAL 1
|
||||
#define ADR_MASK 0xfffff000 /* 1 k byte */
|
||||
#define BYT_MASK 0x00000003 /* byte address inside a word */
|
||||
|
||||
static void init (pt_lkdins, pt_mem)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
unsigned char *pt_mem ;
|
||||
|
||||
{
|
||||
static void splitname ();
|
||||
char *name ;
|
||||
char fil_name [128];
|
||||
unsigned int fil_addr = 0;
|
||||
unsigned int fil_byte = 0;
|
||||
FILE *fp ;
|
||||
unsigned int cur_adr = 0;
|
||||
unsigned int cur_val = 0;
|
||||
unsigned int red_c = 0;
|
||||
unsigned int red_val = 0;
|
||||
unsigned int state = READ_ADR;
|
||||
|
||||
name = vhx_GetInstanceName (pt_lkdins);
|
||||
|
||||
splitname (name, fil_name, &fil_addr, &fil_byte);
|
||||
|
||||
if ((fp = mbkfopen (fil_name, "ini", READ_TEXT)) == NULL)
|
||||
{
|
||||
fprintf (stderr, "cannot open RAM initialization file: %s.ini\n", fil_name);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
printf ("loading RAM initialization file: %s.ini , %.8x , %d\n",
|
||||
fil_name, fil_addr, fil_byte);
|
||||
|
||||
|
||||
while ((red_c = fgetc (fp)) != EOF)
|
||||
{
|
||||
switch (red_c)
|
||||
{
|
||||
case ' ' :
|
||||
case '\t':
|
||||
break;
|
||||
|
||||
case '\n':
|
||||
if (((cur_adr & ADR_MASK) == fil_addr) &&
|
||||
((cur_adr & BYT_MASK) == fil_byte) )
|
||||
pt_mem [(cur_adr & (~ADR_MASK)) >> 2] = cur_val;
|
||||
|
||||
state = READ_ADR;
|
||||
cur_adr = 0;
|
||||
cur_val = 0;
|
||||
break;
|
||||
|
||||
case ':' :
|
||||
state = READ_VAL;
|
||||
break;
|
||||
|
||||
default :
|
||||
if ((red_c >= '0') && (red_c <= '9'))
|
||||
red_val = red_c - '0';
|
||||
if ((red_c >= 'a') && (red_c <= 'f'))
|
||||
red_val = red_c - 'a' + 10;
|
||||
if ((red_c >= 'A') && (red_c <= 'F'))
|
||||
red_val = red_c - 'A' + 10;
|
||||
|
||||
if (state == READ_ADR)
|
||||
cur_adr = (cur_adr << 4) + red_val;
|
||||
else
|
||||
cur_val = (cur_val << 4) + red_val;
|
||||
}
|
||||
}
|
||||
|
||||
fclose (fp);
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : splitname */
|
||||
/* description : split the instance's name in file name, address and */
|
||||
/* byte position: xxxx.filname_address.xxx_b */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void splitname (name, fil_name, adr_pnt, byt_pnt)
|
||||
|
||||
char *name ;
|
||||
char *fil_name;
|
||||
unsigned int *adr_pnt ;
|
||||
unsigned int *byt_pnt ;
|
||||
|
||||
{
|
||||
unsigned int state = 0;
|
||||
unsigned int i = 0;
|
||||
unsigned int j = 0;
|
||||
unsigned int l_idx = 0;
|
||||
unsigned int adr = 0;
|
||||
unsigned int byt = 0;
|
||||
|
||||
strcpy (fil_name, name);
|
||||
|
||||
for (i=0 ; name [i] != '\0' ; i++)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
if (name [i] == '_')
|
||||
{
|
||||
state = 1;
|
||||
l_idx = i;
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
state ++;
|
||||
if ((name [i] >= '0') && (name [i] <= '9'))
|
||||
adr = (adr << 4) + (name [i] - '0');
|
||||
else
|
||||
{
|
||||
if ((name [i] >= 'a') && (name [i] <= 'f'))
|
||||
adr = (adr << 4) + (name [i] - 'a' + 10);
|
||||
else
|
||||
{
|
||||
adr = 0;
|
||||
if (name [i] == '_')
|
||||
state = 1;
|
||||
else
|
||||
state = 0;
|
||||
l_idx = i;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fil_name [l_idx] = '\0';
|
||||
*adr_pnt = adr ;
|
||||
*byt_pnt = name [i-1] - '0';
|
||||
}
|
|
@ -0,0 +1,110 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : c_sr8k_8a.c */
|
||||
/* date : Jun 3 1997 */
|
||||
/* version : v2.02 */
|
||||
/* author : Pirouz Bazargan Sabet */
|
||||
/* content : C model of a circuit */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "vh_ltype.h"
|
||||
#include "vh_xcomm.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : c_sr8k_8a */
|
||||
/* description : A 8 KByte static Ram with a chip select pin */
|
||||
/* called func. : vhx_getvalu, vhx_readinput, vhx_writebus */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void c_sr8k_8a (pt_lkdins)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
|
||||
{
|
||||
char e_n ; /* chip select */
|
||||
char w_n ; /* write enable */
|
||||
unsigned int dat ; /* input-output 8-bit data */
|
||||
unsigned int adr ; /* 13-bit address */
|
||||
char vdd ; /* power supply */
|
||||
char vss ; /* power supply */
|
||||
|
||||
#define POSI_vss 0
|
||||
#define POSI_vdd POSI_vss + 1
|
||||
#define POSI_adr POSI_vdd + 1
|
||||
#define POSI_dat POSI_adr + 13
|
||||
#define POSI_w_n POSI_dat + 8
|
||||
#define POSI_e_n POSI_w_n + 1
|
||||
|
||||
#define POSO_dat 0
|
||||
|
||||
unsigned char *mem ;
|
||||
unsigned int cond = 0;
|
||||
static void init () ;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the current value of input signals (e_n) */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
e_n = vhx_readinput (pt_lkdins, POSI_e_n, 1);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the current value of input signals */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (e_n == 0)
|
||||
{
|
||||
w_n = vhx_readinput (pt_lkdins, POSI_w_n, 1);
|
||||
adr = vhx_readinput (pt_lkdins, POSI_adr, 13);
|
||||
dat = vhx_readinput (pt_lkdins, POSI_dat, 8);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* get the memory space reserved for the current instance */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhx_getvalu (pt_lkdins, &mem, 1024 * 8, init);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read or write the data from the memory */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (w_n == 0)
|
||||
mem [adr] = dat;
|
||||
else
|
||||
dat = mem [adr];
|
||||
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* write the result into the projected value of ouput signals */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if ((e_n == 0) && (w_n == 1))
|
||||
cond = 0x000000ff;
|
||||
else
|
||||
cond = 0x00000000;
|
||||
|
||||
vhx_writebus (dat, cond, pt_lkdins, POSO_dat, 8);
|
||||
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : init */
|
||||
/* description : initializations */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void init (pt_lkdins, pt_mem)
|
||||
|
||||
struct lkdins *pt_lkdins;
|
||||
char *pt_mem ;
|
||||
|
||||
{
|
||||
char *name;
|
||||
|
||||
name = vhx_GetInstanceName (pt_lkdins);
|
||||
printf ("coucou %s\n", name);
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst100.h */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v107 */
|
||||
/* author : DUNOYER Julien */
|
||||
/* contents : defines and structure definitions used in CST library */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#ifndef CST_CSTDEF
|
||||
#define CST_CSTDEF
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* defines */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
#define CST_SUCCEED 0x00 /* function call : succeed */
|
||||
#define CST_FAILED 0x01 /* function call : failed */
|
||||
#define CST_WARNING 0x80 /* function call : warning */
|
||||
#define CST_ERROR 0x40 /* function call : error */
|
||||
#define CST_BUG 0x20 /* function call : bug */
|
||||
#define CST_EXIT 0x10 /* function call : exit */
|
||||
|
||||
#define CST_MSG__BUG 0x01 /* message level : bug */
|
||||
#define CST_MSG__ERR 0x02 /* message level : error */
|
||||
#define CST_MSG__WARN 0x04 /* message level : warning */
|
||||
#define CST_MSG__MESG 0x08 /* message level : message */
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* global variables definition */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
extern unsigned long CST_STATUS; /* function calls status */
|
||||
|
||||
extern unsigned long CST_MSGLVL; /* message level */
|
||||
|
||||
extern unsigned int CST_ERRCOD; /* error code */
|
||||
extern unsigned int CST_ERRCNT; /* error count */
|
||||
extern unsigned int CST_MAXERR; /* maximum error count */
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* structure definitions */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* macros definitions */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
#define CST_ELEMENT_COMPARE( elt1, elt2 ) \
|
||||
(long)((unsigned long)(elt1) - (unsigned long)(elt2))
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* functions */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
extern void cst_error ();
|
||||
|
||||
extern chain_list *cst_AddSetElement ();
|
||||
extern chain_list *cst_RemSetElement ();
|
||||
|
||||
extern int cst_IsInSetElement ();
|
||||
extern int cst_SetCompare ();
|
||||
extern int cst_DisjunctiveSet ();
|
||||
|
||||
extern chain_list *cst_CreateUnionSet ();
|
||||
extern chain_list *cst_CreateIntersectionSet ();
|
||||
extern chain_list *cst_CreateComplementSet ();
|
||||
|
||||
extern void *cst_GetFirstElement ();
|
||||
extern void *cst_GetNextElement ();
|
||||
extern void *cst_GetLastElement ();
|
||||
extern void *cst_GetPreviousElement ();
|
||||
#endif
|
|
@ -0,0 +1,75 @@
|
|||
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_AddSetElt.c */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v100 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : high level function */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_AddSetElement */
|
||||
/* description : Add a pointer element in a pointer set. */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
chain_list *cst_AddSetElement (set,element)
|
||||
|
||||
chain_list *set ;
|
||||
void *element ;
|
||||
|
||||
{
|
||||
chain_list *set_pnt = NULL;
|
||||
chain_list *sav_pnt = NULL;
|
||||
|
||||
CST_STATUS = CST_SUCCEED;
|
||||
|
||||
if ( set == NULL )
|
||||
{
|
||||
set = addchain ( set, element );
|
||||
return( set );
|
||||
}
|
||||
|
||||
if ( CST_ELEMENT_COMPARE(element,set->DATA) == 0 )
|
||||
{
|
||||
return( set );
|
||||
}
|
||||
|
||||
if ( CST_ELEMENT_COMPARE(element,set->DATA) < 0 )
|
||||
{
|
||||
set = addchain ( set, element );
|
||||
return( set );
|
||||
}
|
||||
|
||||
sav_pnt = set;
|
||||
set_pnt = set->NEXT;
|
||||
|
||||
while ( set_pnt != NULL )
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(element,set_pnt->DATA) == 0 )
|
||||
{
|
||||
return( set );
|
||||
}
|
||||
|
||||
if ( CST_ELEMENT_COMPARE(element,set_pnt->DATA) < 0 )
|
||||
{
|
||||
set_pnt = addchain ( set_pnt, element );
|
||||
sav_pnt->NEXT = set_pnt;
|
||||
return( set );
|
||||
}
|
||||
|
||||
sav_pnt = set_pnt;
|
||||
set_pnt = set_pnt->NEXT;
|
||||
}
|
||||
|
||||
set_pnt = addchain ( set_pnt, element );
|
||||
sav_pnt->NEXT = set_pnt;
|
||||
return (set);
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_CrtCompSet.c */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v100 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : high level function */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_CreateComplementSet */
|
||||
/* description : Create The Complement between two pointers sets. */
|
||||
/* This mean set1 - set2. */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
chain_list *cst_CreateComplementSet (set1, set2)
|
||||
|
||||
chain_list *set1 ;
|
||||
chain_list *set2 ;
|
||||
|
||||
{
|
||||
chain_list *set_pnt = NULL;
|
||||
|
||||
CST_STATUS = CST_SUCCEED;
|
||||
|
||||
while ((set1 != NULL) && (set2 != NULL))
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(set1->DATA, set2->DATA) < 0 )
|
||||
{
|
||||
set_pnt = addchain (set_pnt, set1->DATA);
|
||||
set1 = set1->NEXT;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(set1->DATA, set2->DATA) == 0 )
|
||||
{
|
||||
set1 = set1->NEXT;
|
||||
set2 = set2->NEXT;
|
||||
}
|
||||
else
|
||||
{
|
||||
cst_error(5, "cst_CreateComplementSet", NULL, 0);
|
||||
set2 = set2->NEXT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (set1 != NULL)
|
||||
{
|
||||
set_pnt = addchain (set_pnt, set1->DATA);
|
||||
set1 = set1->NEXT;
|
||||
}
|
||||
|
||||
if (set2 != NULL)
|
||||
{
|
||||
cst_error(5, "cst_CreateComplementSet", NULL, 0);
|
||||
}
|
||||
|
||||
set_pnt = reverse (set_pnt);
|
||||
return (set_pnt);
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_CrtInterSet.c */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v100 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : high level function */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_CreateIntersectionSet */
|
||||
/* description : Create The Intersection between two pointers sets. */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
chain_list *cst_CreateIntersectionSet (set1, set2)
|
||||
|
||||
chain_list *set1 ;
|
||||
chain_list *set2 ;
|
||||
|
||||
{
|
||||
chain_list *set_pnt = NULL;
|
||||
|
||||
CST_STATUS = CST_SUCCEED;
|
||||
|
||||
while ((set1 != NULL) && ( set2 != NULL))
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(set1->DATA, set2->DATA) == 0 )
|
||||
{
|
||||
set_pnt = addchain (set_pnt, set1->DATA);
|
||||
set1 = set1->NEXT;
|
||||
set2 = set2->NEXT;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(set1->DATA, set2->DATA) < 0 )
|
||||
{
|
||||
set1 = set1->NEXT;
|
||||
}
|
||||
else
|
||||
{
|
||||
set2 = set2->NEXT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set_pnt = reverse( set_pnt);
|
||||
|
||||
return (set_pnt);
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_CrtUnionSet.c */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v100 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : high level function */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_CreateUnionSet */
|
||||
/* description : Create The Union between two pointers sets. */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
chain_list *cst_CreateUnionSet (set1, set2)
|
||||
|
||||
chain_list *set1 ;
|
||||
chain_list *set2 ;
|
||||
|
||||
{
|
||||
chain_list *set_pnt = NULL;
|
||||
|
||||
CST_STATUS = CST_SUCCEED;
|
||||
|
||||
while ((set1 != NULL) && ( set2 != NULL))
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(set1->DATA, set2->DATA) == 0 )
|
||||
{
|
||||
set_pnt = addchain (set_pnt, set1->DATA);
|
||||
set1 = set1->NEXT;
|
||||
set2 = set2->NEXT;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(set1->DATA, set2->DATA) < 0 )
|
||||
{
|
||||
set_pnt = addchain (set_pnt, set1->DATA);
|
||||
set1 = set1->NEXT;
|
||||
}
|
||||
else
|
||||
{
|
||||
set_pnt = addchain (set_pnt, set2->DATA);
|
||||
set2 = set2->NEXT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (set1 != NULL)
|
||||
{
|
||||
set_pnt = addchain (set_pnt, set1->DATA);
|
||||
set1 = set1->NEXT;
|
||||
}
|
||||
|
||||
while (set2 != NULL)
|
||||
{
|
||||
set_pnt = addchain (set_pnt, set2->DATA);
|
||||
set2 = set2->NEXT;
|
||||
}
|
||||
|
||||
set_pnt = reverse(set_pnt);
|
||||
|
||||
return (set_pnt);
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_DisjunctSet.c */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v100 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : high level function */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_DisjunctiveSet */
|
||||
/* description : check The Disjunction between two pointers sets. */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
int cst_DisjunctiveSet (set1, set2)
|
||||
|
||||
chain_list *set1 ;
|
||||
chain_list *set2 ;
|
||||
|
||||
{
|
||||
CST_STATUS = CST_SUCCEED;
|
||||
|
||||
while ((set1 != NULL) && ( set2 != NULL))
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(set1->DATA, set2->DATA) == 0 )
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(set1->DATA, set2->DATA) < 0 )
|
||||
{
|
||||
set1 = set1->NEXT;
|
||||
}
|
||||
else
|
||||
{
|
||||
set2 = set2->NEXT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_GetFirstElt.c */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v100 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : high level function */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_GetFirstElement */
|
||||
/* description : Get the first pointer element in a pointer set. */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void *cst_GetFirstElement (set)
|
||||
|
||||
chain_list *set ;
|
||||
|
||||
{
|
||||
void *element = NULL;
|
||||
|
||||
CST_STATUS = CST_SUCCEED;
|
||||
|
||||
if ( set == NULL )
|
||||
{
|
||||
CST_STATUS = CST_FAILED;
|
||||
}
|
||||
else
|
||||
{
|
||||
element = set->DATA;
|
||||
}
|
||||
|
||||
return ( element );
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_GetLastElt.c */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v100 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : high level function */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_GetLastElement */
|
||||
/* description : Get the last pointer element in a pointer set. */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void *cst_GetLastElement (set)
|
||||
|
||||
chain_list *set ;
|
||||
|
||||
{
|
||||
void *element = NULL;
|
||||
|
||||
CST_STATUS = CST_SUCCEED;
|
||||
|
||||
if ( set == NULL )
|
||||
{
|
||||
CST_STATUS = CST_FAILED;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (set->NEXT != NULL)
|
||||
{
|
||||
set = set->NEXT;
|
||||
}
|
||||
element = set->DATA;
|
||||
}
|
||||
|
||||
return ( element );
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_GetNextElt.c */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v100 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : high level function */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_GetNextElement */
|
||||
/* description : Get the next pointer element in a pointer set. */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void *cst_GetNextElement (set, current)
|
||||
|
||||
chain_list *set ;
|
||||
void *current ;
|
||||
|
||||
{
|
||||
void *element = NULL;
|
||||
|
||||
CST_STATUS = CST_SUCCEED;
|
||||
|
||||
if ( set == NULL )
|
||||
{
|
||||
cst_error(2,"cst_GetNextElement",NULL,0);
|
||||
return ( element );
|
||||
}
|
||||
|
||||
while (set != NULL)
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(current,set->DATA) < 0 )
|
||||
{
|
||||
element = set->DATA;
|
||||
break;
|
||||
}
|
||||
set = set->NEXT;
|
||||
}
|
||||
|
||||
if (element == NULL)
|
||||
{
|
||||
CST_STATUS = CST_FAILED;
|
||||
}
|
||||
|
||||
return ( element );
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_GetPrevElt.c */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v100 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : high level function */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_GetPreviousElement */
|
||||
/* description : Get the previous pointer element in a pointer set. */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void *cst_GetPreviousElement (set, current)
|
||||
|
||||
chain_list *set ;
|
||||
void *current ;
|
||||
|
||||
{
|
||||
void *element = NULL;
|
||||
chain_list *sav_pnt = NULL;
|
||||
|
||||
CST_STATUS = CST_SUCCEED;
|
||||
|
||||
if ( set == NULL )
|
||||
{
|
||||
cst_error(2,"cst_GetPreviousElement",NULL,0);
|
||||
}
|
||||
|
||||
while (set != NULL)
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(current,set->DATA) <= 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
sav_pnt = set;
|
||||
set = set->NEXT;
|
||||
}
|
||||
|
||||
if (sav_pnt == NULL)
|
||||
{
|
||||
CST_STATUS = CST_FAILED;
|
||||
}
|
||||
else
|
||||
{
|
||||
element = sav_pnt->DATA;
|
||||
}
|
||||
|
||||
return ( element );
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_IsInSetElt.c */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v100 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : high level function */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_IsInSetElement */
|
||||
/* description : Is a pointer element in a pointer set. */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
int cst_IsInSetElement (set,element)
|
||||
|
||||
chain_list *set ;
|
||||
void *element ;
|
||||
|
||||
{
|
||||
chain_list *set_pnt = NULL;
|
||||
|
||||
CST_STATUS = CST_SUCCEED;
|
||||
|
||||
if ( set == NULL )
|
||||
{
|
||||
cst_error(2,"cst_IsInSetElement",NULL,0);
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
set_pnt = set;
|
||||
|
||||
while ( set_pnt != NULL )
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(element,set_pnt->DATA) == 0 )
|
||||
{
|
||||
return( 1 );
|
||||
}
|
||||
|
||||
if ( CST_ELEMENT_COMPARE(element,set_pnt->DATA) < 0 )
|
||||
{
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
set_pnt = set_pnt->NEXT;
|
||||
}
|
||||
|
||||
return ( 0 );
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_RemSetElt.c */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v100 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : high level function */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_RemSetElement */
|
||||
/* description : Remove a pointer element in a pointer set. */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
chain_list *cst_RemSetElement (set,element)
|
||||
|
||||
chain_list *set ;
|
||||
void *element ;
|
||||
|
||||
{
|
||||
chain_list *set_pnt = NULL;
|
||||
|
||||
CST_STATUS = CST_SUCCEED;
|
||||
|
||||
if ( set == NULL )
|
||||
{
|
||||
cst_error(2,"cst_RemSetElement",NULL,0);
|
||||
return( set );
|
||||
}
|
||||
|
||||
set_pnt = set;
|
||||
|
||||
while ( set_pnt != NULL )
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(element,set_pnt->DATA) == 0 )
|
||||
{
|
||||
set = delchain (set, set_pnt);
|
||||
return( set );
|
||||
}
|
||||
|
||||
if ( CST_ELEMENT_COMPARE(element,set_pnt->DATA) < 0 )
|
||||
{
|
||||
cst_error(4,"cst_RemSetElement",NULL,0);
|
||||
return( set );
|
||||
}
|
||||
|
||||
set_pnt = set_pnt->NEXT;
|
||||
}
|
||||
|
||||
cst_error(4,"cst_RemSetElement",NULL,0);
|
||||
return (set);
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_CmpSet.c */
|
||||
/* date : Dec 20 1994 */
|
||||
/* version : v100 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : high level function */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_SetCompare */
|
||||
/* description : compare two sets. */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
int cst_SetCompare (set1, set2)
|
||||
|
||||
chain_list *set1 ;
|
||||
chain_list *set2 ;
|
||||
|
||||
{
|
||||
CST_STATUS = CST_SUCCEED;
|
||||
|
||||
while ((set1 != NULL) && ( set2 != NULL))
|
||||
{
|
||||
if ( CST_ELEMENT_COMPARE(set1->DATA, set2->DATA) == 0 )
|
||||
{
|
||||
set1 = set1->NEXT;
|
||||
set2 = set2->NEXT;
|
||||
}
|
||||
else
|
||||
return(1);
|
||||
}
|
||||
|
||||
if ((set1 != NULL) || (set2 != NULL))
|
||||
return(1);
|
||||
|
||||
return (0);
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_error.c */
|
||||
/* date : Dec 24 1994 */
|
||||
/* version : v000 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : system level functions */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : cst_error */
|
||||
/* description : print an error message on standard error output */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void cst_error (code, str1, str2, dat1)
|
||||
|
||||
int code;
|
||||
char *str1;
|
||||
char *str2;
|
||||
int dat1;
|
||||
|
||||
{
|
||||
CST_ERRCNT++;
|
||||
CST_ERRCOD = code;
|
||||
CST_STATUS = CST_ERROR;
|
||||
|
||||
if (((CST_MSGLVL & CST_MSG__ERR) != 0) && ((CST_ERRCNT < CST_MAXERR)))
|
||||
{
|
||||
fprintf (stderr, "Cst Error %d in func. `%s`: ", code, str1);
|
||||
|
||||
switch (code)
|
||||
{
|
||||
|
||||
default:
|
||||
fprintf (stderr,"unknown error: %d\n", code);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (CST_ERRCNT == CST_MAXERR)
|
||||
fprintf (stderr ,"Too many errors : cant explain them further more");
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* */
|
||||
/* file : cst_globals.c */
|
||||
/* date : Dec 17 1994 */
|
||||
/* version : v000 */
|
||||
/* authors : DUNOYER Julien & ABDALLAH Nizar */
|
||||
/* description : global variables */
|
||||
/* */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "cst.h"
|
||||
|
||||
unsigned long CST_STATUS = CST_SUCCEED; /* function call status */
|
||||
|
||||
unsigned long CST_MSGLVL = CST_MSG__ERR; /* message level */
|
||||
|
||||
unsigned int CST_ERRCOD = 0; /* error code */
|
||||
unsigned int CST_ERRCNT = 0; /* error count */
|
||||
unsigned int CST_MAXERR = 10; /* maximum error count */
|
|
@ -0,0 +1,108 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch110.h */
|
||||
/* date : Aug 10 1999 */
|
||||
/* version : v110 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BAZARGAN SABET */
|
||||
/* contents : defines and structure definitions used in SCH library */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#ifndef SCH_SCHDEF
|
||||
#define SCH_SCHDEF
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* basic defines */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
#define SCH_DFN_TRABLOCK 1024 /* size of block */
|
||||
#define SCH_DFN_ENTBLOCK 256 /* size of block */
|
||||
#define SCH_DFN_WAVBLOCK 256 /* size of block */
|
||||
|
||||
#define SCH_TRA_DELNONE 0x00 /* transcation flag: no action */
|
||||
#define SCH_TRA_DELAFTER 0x01 /* transcation flag: del after */
|
||||
#define SCH_TRA_DELBEFORE 0x02 /* transcation flag: del before */
|
||||
|
||||
#define SCH_TRA_ENTFIRST 0x04 /* transcation flag: 1 of list */
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* complexe defines */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
#define SCH_TRA_DELALL SCH_TRA_DELAFTER | SCH_TRA_DELBEFORE
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* structure definitions */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
struct shdul /* scheduler */
|
||||
{
|
||||
struct shdul *NEXT ; /* next scheduler */
|
||||
void *LABEL ; /* scheduler's label */
|
||||
struct shent **TTABLE ; /* time table */
|
||||
struct shwav **ITABLE ; /* identifier table */
|
||||
unsigned int CURTIME ; /* current absolute time */
|
||||
};
|
||||
|
||||
struct shtra /* transaction */
|
||||
{
|
||||
struct shtra *NEXT ; /* next transaction */
|
||||
struct shtra *PREV ; /* previous transaction */
|
||||
struct shtra *WAVE ; /* waveform for the same identifier */
|
||||
unsigned int DATE ; /* transaction's date */
|
||||
void *IDENT ; /* main identifier */
|
||||
void *SCDID ; /* second identifier */
|
||||
unsigned int UFLAG ; /* user's flags */
|
||||
unsigned char COND ; /* condition value */
|
||||
unsigned char VALU ; /* value */
|
||||
unsigned short FLAGS ; /* flags */
|
||||
};
|
||||
|
||||
struct shent /* scheduler entry */
|
||||
{
|
||||
struct shent *NEXT ; /* next entry */
|
||||
unsigned int DATE ; /* entry's date (high order bits) */
|
||||
struct shtra *TRANS [8]; /* list of transactions */
|
||||
};
|
||||
|
||||
struct shwav /* waveform */
|
||||
{
|
||||
struct shwav *NEXT ; /* next waveform */
|
||||
void *IDENT ; /* main identifier */
|
||||
struct shtra *TRANS ; /* list of transactions */
|
||||
};
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* global variables */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
extern struct shtra *SCH_FREE_SHTRA ;
|
||||
extern struct shent *SCH_FREE_SHENT ;
|
||||
extern struct shwav *SCH_FREE_SHWAV ;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* functions */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
extern void sch_bug ();
|
||||
extern int sch_error ();
|
||||
extern void sch_message ();
|
||||
|
||||
extern void sch_debug ();
|
||||
|
||||
extern unsigned int sch_hash ();
|
||||
extern struct shtra *sch_addshtra ();
|
||||
extern struct shwav *sch_addshwav ();
|
||||
extern struct shent *sch_addshent ();
|
||||
extern struct shtra *sch_rmventry ();
|
||||
extern void sch_insentry ();
|
||||
extern void sch_inswave ();
|
||||
|
||||
extern struct shdul *sch_CreateScheduler ();
|
||||
extern void sch_AddTranscation ();
|
||||
extern struct shtra *sch_GetCurrentTransactions ();
|
||||
extern int sch_GotoNextTime ();
|
||||
extern int sch_GetNextTime ();
|
||||
extern void sch_FreeTransactions ();
|
||||
extern unsigned int sch_GetCurrentTime ();
|
||||
|
||||
#endif
|
|
@ -0,0 +1,38 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_AddTra.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_AddTranscation */
|
||||
/* description : insert a new transaction into the scheduler */
|
||||
/* called func. : sch_addshent, sch_addshtra */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void sch_AddTransaction (pt_shdul, ident, scdid, date, cond, valu, uflag, flags)
|
||||
|
||||
struct shdul *pt_shdul;
|
||||
void *ident ;
|
||||
void *scdid ;
|
||||
unsigned int date ;
|
||||
unsigned char cond ;
|
||||
unsigned char valu ;
|
||||
unsigned int uflag ;
|
||||
unsigned short flags ;
|
||||
|
||||
{
|
||||
struct shtra *pt_shtra;
|
||||
|
||||
date += pt_shdul->CURTIME;
|
||||
pt_shtra = sch_addshtra (ident, scdid, date, cond, valu, uflag, flags);
|
||||
|
||||
sch_insentry (pt_shdul, pt_shtra );
|
||||
sch_inswave (pt_shdul, pt_shtra, flags);
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_CrtSch.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_CreatScheduler */
|
||||
/* description : create a new scheduler and initialize its time table */
|
||||
/* and identifier table */
|
||||
/* called func. : mbkalloc */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct shdul *sch_CreateScheduler (old_shdul, label)
|
||||
|
||||
struct shdul *old_shdul;
|
||||
void *label ;
|
||||
|
||||
{
|
||||
unsigned int i ;
|
||||
struct shdul *pt_shdul;
|
||||
struct shent **pt_time ;
|
||||
struct shwav **pt_ident;
|
||||
|
||||
|
||||
pt_shdul = (struct shdul *) mbkalloc (sizeof (struct shdul ) );
|
||||
pt_time = (struct shent **) mbkalloc (sizeof (struct shent *) * 256);
|
||||
pt_ident = (struct shwav **) mbkalloc (sizeof (struct shwav *) * 256);
|
||||
|
||||
for (i=0 ; i<256 ; i++)
|
||||
pt_time [i] = NULL;
|
||||
|
||||
for (i=0 ; i<256 ; i++)
|
||||
pt_ident [i] = NULL;
|
||||
|
||||
pt_shdul->LABEL = label ;
|
||||
pt_shdul->TTABLE = pt_time ;
|
||||
pt_shdul->ITABLE = pt_ident ;
|
||||
pt_shdul->CURTIME = 0 ;
|
||||
pt_shdul->NEXT = old_shdul;
|
||||
|
||||
return (pt_shdul);
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_Free.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_FreeTranscations */
|
||||
/* description : release a list of transactions extracted from the */
|
||||
/* scheduler */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void sch_FreeTransactions (pt_shtra)
|
||||
|
||||
struct shtra *pt_shtra;
|
||||
|
||||
{
|
||||
struct shtra *pt_last;
|
||||
|
||||
pt_last = pt_shtra;
|
||||
|
||||
while (pt_last->NEXT != NULL)
|
||||
pt_last = pt_last->NEXT;
|
||||
|
||||
pt_last->NEXT = SCH_FREE_SHTRA;
|
||||
SCH_FREE_SHTRA = pt_shtra ;
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_GetCTim.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_GetCurrentTime */
|
||||
/* description : returns the scheduler's current time */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
unsigned int sch_GetCurrentTime (pt_shdul)
|
||||
|
||||
struct shdul *pt_shdul;
|
||||
|
||||
{
|
||||
return (pt_shdul->CURTIME);
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_GetCTra.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_GetCurrentTransactions */
|
||||
/* description : return all transactions at current date and remove */
|
||||
/* them from the scheduler */
|
||||
/* called func. : sch_bug */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct shtra *sch_GetCurrentTransactions (pt_shdul)
|
||||
|
||||
struct shdul *pt_shdul;
|
||||
|
||||
{
|
||||
struct shtra *pt_shtra = NULL;
|
||||
struct shwav *pt_shwav = NULL;
|
||||
struct shent *pt_shent = NULL;
|
||||
unsigned int time_window ;
|
||||
unsigned int wind_offset ;
|
||||
unsigned int wind_number ;
|
||||
void *ident ;
|
||||
unsigned int index ;
|
||||
|
||||
time_window = (pt_shdul->CURTIME >> 3) & 0x000000ff;
|
||||
wind_number = (pt_shdul->CURTIME >> 11) & 0x001fffff;
|
||||
wind_offset = (pt_shdul->CURTIME ) & 0x00000007;
|
||||
|
||||
pt_shent = pt_shdul->TTABLE [time_window];
|
||||
|
||||
|
||||
if ((pt_shent == NULL) || (pt_shent->DATE != wind_number))
|
||||
{
|
||||
sch_bug (1, "sch_GetCurrentTranscations", NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
pt_shtra = pt_shent->TRANS [wind_offset];
|
||||
if (pt_shtra == NULL)
|
||||
{
|
||||
printf ("sch_bug amar 2 : %x\n", pt_shtra);
|
||||
sch_bug (1, "sch_GetCurrentTranscations", NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
while (pt_shtra != NULL)
|
||||
{
|
||||
ident = pt_shtra->IDENT;
|
||||
index = sch_hash (ident);
|
||||
pt_shwav = pt_shdul->ITABLE [index];
|
||||
|
||||
while (pt_shwav->IDENT != ident)
|
||||
pt_shwav = pt_shwav->NEXT;
|
||||
|
||||
if ((pt_shwav == NULL) || (pt_shwav->TRANS != pt_shtra))
|
||||
{
|
||||
printf ("wav : %x, tra : %x\n", pt_shwav->TRANS, pt_shtra);
|
||||
sch_debug (pt_shtra, "shtra");
|
||||
sch_debug (pt_shwav, "shwav");
|
||||
sch_bug (2, "sch_GetCurrentTranscations", NULL);
|
||||
}
|
||||
else
|
||||
pt_shwav->TRANS = pt_shtra->WAVE;
|
||||
|
||||
pt_shtra = pt_shtra->NEXT;
|
||||
}
|
||||
|
||||
pt_shtra = pt_shent->TRANS [wind_offset];
|
||||
pt_shent->TRANS [wind_offset] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return (pt_shtra);
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_GetNTim.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_GetNextTime */
|
||||
/* description : return the date of the first transaction as an */
|
||||
/* argument. If the scheduler is empty the function */
|
||||
/* returns the value 0. The functions also releases */
|
||||
/*/ empty time-entries in the scheduler */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
int sch_GetNextTime (pt_shdul, pt_date)
|
||||
|
||||
struct shdul *pt_shdul;
|
||||
unsigned int *pt_date ;
|
||||
|
||||
{
|
||||
struct shtra *pt_shtra ;
|
||||
struct shent *pt_shent ;
|
||||
struct shent *pt_nxtent ;
|
||||
unsigned int min_window = 0;
|
||||
unsigned int min_offset = 0;
|
||||
unsigned int min_number = 0;
|
||||
unsigned int time_window ;
|
||||
unsigned int wind_number ;
|
||||
unsigned int i ;
|
||||
unsigned int j ;
|
||||
unsigned int index ;
|
||||
int glob_found = 0;
|
||||
|
||||
time_window = (pt_shdul->CURTIME >> 3) & 0x000000ff;
|
||||
wind_number = (pt_shdul->CURTIME >> 11) & 0x001fffff;
|
||||
|
||||
for (i=0 ; i<256 ; i++)
|
||||
{
|
||||
index = (i + time_window) % 256;
|
||||
pt_shent = pt_shdul->TTABLE [index];
|
||||
while (pt_shent != NULL)
|
||||
{
|
||||
for (j=0 ; j<8 ; j++)
|
||||
{
|
||||
if (pt_shent->TRANS [j] != NULL)
|
||||
{
|
||||
if ( (glob_found == 0 ) ||
|
||||
(pt_shent->DATE < min_number) ||
|
||||
((pt_shent->DATE == min_number) && (index < min_window)))
|
||||
{
|
||||
min_window = index ;
|
||||
min_offset = j ;
|
||||
min_number = pt_shent->DATE;
|
||||
glob_found = 1 ;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (j == 8)
|
||||
{
|
||||
pt_nxtent = pt_shent->NEXT;
|
||||
pt_shdul->TTABLE [index] = pt_nxtent ;
|
||||
pt_shent->NEXT = SCH_FREE_SHENT;
|
||||
SCH_FREE_SHENT = pt_shent ;
|
||||
pt_shent = pt_nxtent ;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if ((glob_found == 1) && (min_number == wind_number))
|
||||
break;
|
||||
}
|
||||
|
||||
if (glob_found == 1)
|
||||
(*pt_date) = (min_number << 11) + (min_window << 3) + min_offset;
|
||||
|
||||
return (glob_found);
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_Goto.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_GotoNextTime */
|
||||
/* description : set the current absolute time to the date of the */
|
||||
/* first transaction and return it as an argument. If */
|
||||
/* the scheduler is empty the function returns the value */
|
||||
/* 0. The functions also releases empty time-entries in */
|
||||
/* the scheduler */
|
||||
/* called func. : sch_GetNextTime */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
int sch_GotoNextTime (pt_shdul)
|
||||
|
||||
struct shdul *pt_shdul;
|
||||
|
||||
{
|
||||
int found = 0;
|
||||
unsigned int n_date ;
|
||||
|
||||
found = sch_GetNextTime (pt_shdul, &n_date);
|
||||
if (found != 0)
|
||||
pt_shdul->CURTIME = n_date;
|
||||
|
||||
return (found);
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_SetCTim.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_SetCurrentTime */
|
||||
/* description : Set the scheduler's current time. */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void sch_SetCurrentTime (pt_shdul, date)
|
||||
|
||||
struct shdul *pt_shdul;
|
||||
unsigned int date ;
|
||||
|
||||
{
|
||||
pt_shdul->CURTIME = date;
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_addshent.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_addshent */
|
||||
/* description : create a time entry point to the scheduler */
|
||||
/* called func. : mbkalloc */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct shent *sch_addshent (old_ent, date)
|
||||
|
||||
struct shent *old_ent;
|
||||
unsigned int date ;
|
||||
|
||||
{
|
||||
struct shent *pt_shent;
|
||||
unsigned int i ;
|
||||
|
||||
if (SCH_FREE_SHENT == NULL)
|
||||
{
|
||||
SCH_FREE_SHENT = (struct shent *)
|
||||
mbkalloc (sizeof (struct shent) * SCH_DFN_ENTBLOCK);
|
||||
|
||||
pt_shent = SCH_FREE_SHENT;
|
||||
for (i=0 ; i<SCH_DFN_ENTBLOCK ; i++)
|
||||
{
|
||||
pt_shent->NEXT = pt_shent + 1;
|
||||
pt_shent ++;
|
||||
}
|
||||
(pt_shent - 1)->NEXT = NULL;
|
||||
}
|
||||
|
||||
pt_shent = SCH_FREE_SHENT;
|
||||
SCH_FREE_SHENT = pt_shent->NEXT;
|
||||
|
||||
for (i=0 ; i<8 ; i++)
|
||||
pt_shent->TRANS [i] = NULL;
|
||||
|
||||
pt_shent->DATE = date ;
|
||||
pt_shent->NEXT = old_ent;
|
||||
|
||||
return (pt_shent);
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_addshtra.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_addshtra */
|
||||
/* description : create a transaction and initilize its field */
|
||||
/* called func. : mbkalloc */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct shtra *sch_addshtra (ident, scdid, date, cond, valu, uflag, flags)
|
||||
|
||||
void *ident;
|
||||
void *scdid;
|
||||
unsigned int date ;
|
||||
unsigned char cond ;
|
||||
unsigned char valu ;
|
||||
unsigned int uflag;
|
||||
unsigned short flags;
|
||||
|
||||
{
|
||||
struct shtra *pt_shtra;
|
||||
unsigned int i ;
|
||||
|
||||
if (SCH_FREE_SHTRA == NULL)
|
||||
{
|
||||
SCH_FREE_SHTRA = (struct shtra *)
|
||||
mbkalloc (sizeof (struct shtra) * SCH_DFN_TRABLOCK);
|
||||
|
||||
pt_shtra = SCH_FREE_SHTRA;
|
||||
for (i=0 ; i<SCH_DFN_TRABLOCK ; i++)
|
||||
{
|
||||
pt_shtra->NEXT = pt_shtra + 1;
|
||||
pt_shtra ++;
|
||||
}
|
||||
(pt_shtra - 1)->NEXT = NULL;
|
||||
}
|
||||
|
||||
pt_shtra = SCH_FREE_SHTRA;
|
||||
SCH_FREE_SHTRA = pt_shtra->NEXT;
|
||||
|
||||
pt_shtra->DATE = date ;
|
||||
pt_shtra->IDENT = ident;
|
||||
pt_shtra->SCDID = scdid;
|
||||
pt_shtra->UFLAG = uflag;
|
||||
pt_shtra->COND = cond ;
|
||||
pt_shtra->VALU = valu ;
|
||||
pt_shtra->FLAGS = flags;
|
||||
|
||||
return (pt_shtra);
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_addshwav.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_addshwav */
|
||||
/* description : create an identifier entry point to the scheduler */
|
||||
/* called func. : mbkalloc */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct shwav *sch_addshwav (old_wav, ident)
|
||||
|
||||
struct shwav *old_wav;
|
||||
void *ident ;
|
||||
|
||||
{
|
||||
struct shwav *pt_shwav;
|
||||
unsigned int i ;
|
||||
|
||||
if (SCH_FREE_SHWAV == NULL)
|
||||
{
|
||||
SCH_FREE_SHWAV = (struct shwav *)
|
||||
mbkalloc (sizeof (struct shwav) * SCH_DFN_WAVBLOCK);
|
||||
|
||||
pt_shwav = SCH_FREE_SHWAV;
|
||||
for (i=0 ; i<SCH_DFN_WAVBLOCK ; i++)
|
||||
{
|
||||
pt_shwav->NEXT = pt_shwav + 1;
|
||||
pt_shwav ++;
|
||||
}
|
||||
(pt_shwav - 1)->NEXT = NULL;
|
||||
}
|
||||
|
||||
pt_shwav = SCH_FREE_SHWAV;
|
||||
SCH_FREE_SHWAV = pt_shwav->NEXT;
|
||||
|
||||
pt_shwav->IDENT = ident ;
|
||||
pt_shwav->NEXT = old_wav;
|
||||
pt_shwav->TRANS = NULL ;
|
||||
|
||||
return (pt_shwav);
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_bug.c */
|
||||
/* date : Aug 10 1997 */
|
||||
/* version : v101 */
|
||||
/* authors : Nizar ABDALLAH, Pirouz BAZARGAN SABET */
|
||||
/* content : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_bug */
|
||||
/* description : print a bug message depending on the argument code */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void sch_bug (code, str1, str2)
|
||||
|
||||
int code;
|
||||
char *str1;
|
||||
char *str2;
|
||||
|
||||
{
|
||||
fprintf (stderr,"bug %d in `%s`:", code, str1);
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case 1:
|
||||
fprintf (stderr, "unconsistency: no transaction at current time\n");
|
||||
break;
|
||||
case 2:
|
||||
fprintf (stderr, "unconsistency: not the first transaction\n");
|
||||
break;
|
||||
default:
|
||||
fprintf (stderr,"unknown bug\n");
|
||||
break;
|
||||
}
|
||||
|
||||
exit (1);
|
||||
}
|
|
@ -0,0 +1,849 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_debug.c */
|
||||
/* date : Aug 10 1997 */
|
||||
/* version : v101 */
|
||||
/* authors : Nizar ABDALLAH, Pirouz BAZARGAN SABET */
|
||||
/* content : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "sch.h"
|
||||
#include "sch_debug.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_debug */
|
||||
/* description : display any structure */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void sch_debug (head_pnt, type)
|
||||
|
||||
void *head_pnt; /* structure's pointer */
|
||||
char *type; /* structure's type */
|
||||
|
||||
{
|
||||
static int translate ();
|
||||
static int splitline ();
|
||||
static void disp_immd ();
|
||||
static void get_size ();
|
||||
static void read_field ();
|
||||
static void push ();
|
||||
static void pop ();
|
||||
static struct chain *go_forward ();
|
||||
|
||||
char line [128]; /* buffer to read a cmd line */
|
||||
char buffer [128]; /* buffer to split the cmd line */
|
||||
|
||||
char *words [ 10]; /* number of words on a line */
|
||||
int nmbrs [ 10]; /* words translated into number */
|
||||
char flags [ 10]; /* set if words is a number */
|
||||
int indxs [ 10]; /* index of words */
|
||||
|
||||
struct stack jtab [ 10]; /* list of memorized addresses */
|
||||
int idx, i;
|
||||
int readflg = 0;
|
||||
int code;
|
||||
unsigned int size;
|
||||
char *pntr = NULL;
|
||||
long pshtype;
|
||||
int wrdcnt = 1;
|
||||
|
||||
struct stack stk [STKSIZ_DFN];
|
||||
int stkpnt = -1;
|
||||
|
||||
union value pnt [MAXCMD_DFN];
|
||||
long typ [MAXCMD_DFN];
|
||||
unsigned int siz [MAXCMD_DFN];
|
||||
|
||||
static char *str [] = {
|
||||
"_back" , "_exit" , "_jump" , "_save" ,
|
||||
"_stop" , "_top" , "_up" , "_display" ,
|
||||
|
||||
"character" , "short" , "integer" , "long" ,
|
||||
"float" , "void" , "string" ,
|
||||
|
||||
"shdul" , "shent" , "shtra" , "shwav" ,
|
||||
|
||||
"cond" , "curtime" , "date" , "flags" ,
|
||||
"ident" , "itable" , "label" , "next" ,
|
||||
"prev" , "scdid" , "trans" , "ttable" ,
|
||||
"uflag" , "valu" , "wave"
|
||||
};
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* initialisation : */
|
||||
/* - allocate a buffer for read words */
|
||||
/* - break the argument that identifies the structure (type) */
|
||||
/* into words */
|
||||
/* - search that words among recognized strings */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
words [0] = buffer;
|
||||
get_size (siz);
|
||||
|
||||
wrdcnt = splitline (words, type);
|
||||
idx = translate (words, wrdcnt, str, nmbrs, flags, indxs);
|
||||
|
||||
typ [idx] = POINTER_DFN | s_DFN | idx;
|
||||
pnt [idx].dat = head_pnt;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* process the command line until the _exit command */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
while ((idx & TYPE_DFN) != _exit_DFN)
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* if the first word of the line has not been recognized, */
|
||||
/* print an error message. Otherwise, proccess the command line */
|
||||
/* (generally it is a request for displaying a specific field). */
|
||||
/* */
|
||||
/* At this point : */
|
||||
/* - pnt [] contains all available pointers */
|
||||
/* - typ [] contains the type of availabale pointers */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (idx == _error_DFN)
|
||||
sch_error (118, "sch_debug", NULL, 0);
|
||||
else
|
||||
{
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* define the type of the structure that may be pushed on */
|
||||
/* the stack : */
|
||||
/* - if the pointer is a VOID pointer the type must be */
|
||||
/* defined on the command line (last word of the command) */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
pshtype = POINTER_DFN | s_DFN | void_DFN;
|
||||
if ((typ [idx] & TYPE_DFN) == void_DFN)
|
||||
{
|
||||
if ((wrdcnt >= 2) && (indxs [wrdcnt - 1] != _error_DFN))
|
||||
pshtype = POINTER_DFN | s_DFN | indxs [wrdcnt - 1];
|
||||
else
|
||||
sch_error (119, "sch_debug", NULL, 0);
|
||||
}
|
||||
else
|
||||
pshtype = typ [idx];
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* depending on the kind of the first word of the command */
|
||||
/* activate actions : */
|
||||
/* - COMMAND (_top, _up, ...) */
|
||||
/* - POINTER */
|
||||
/* - for NEXT go forward until the Nth element of the */
|
||||
/* list. Then, push it on the stack and read fields */
|
||||
/* - for others push and read fields */
|
||||
/* - ARRAY */
|
||||
/* - push the Nth element of the array and read its */
|
||||
/* fields */
|
||||
/* - ARRAY OF POINTER */
|
||||
/* - push the object which address is the Nth element of */
|
||||
/* the array and read its fields */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
switch (typ [idx] & KIND_DFN)
|
||||
{
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* COMMANDS ... */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case COMMAND_DFN :
|
||||
|
||||
switch (typ [idx] & TYPE_DFN)
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* _top COMMAND : reset the stack pointer, call read_field */
|
||||
/* to read the structure on the top of stack */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case _top_DFN :
|
||||
stkpnt = 0;
|
||||
readflg = 1;
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* _stop COMMAND : set the stop mark for the structure on */
|
||||
/* the top of stack */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case _stop_DFN :
|
||||
stk [stkpnt].mark = 1;
|
||||
sch_message (19, "sch_debug", 0);
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* _back COMMAND : pop structures from the stack until a */
|
||||
/* marked structure is found. Call read_field to read the */
|
||||
/* structure on the top of stack */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case _back_DFN :
|
||||
while ((stkpnt != 0) && (stk[--stkpnt].mark != 1));
|
||||
readflg = 1;
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* _jump COMMAND : push on the stack the structure saved in */
|
||||
/* the jump table. Call read_field to read the structure on the */
|
||||
/* top of stack */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case _jump_DFN :
|
||||
if ((wrdcnt == 2) && (flags [1] == 1) && (nmbrs [1] < 10))
|
||||
{
|
||||
push (stk, &stkpnt, jtab[nmbrs[1]].data, jtab[nmbrs[1]].type);
|
||||
readflg = 1;
|
||||
}
|
||||
else
|
||||
sch_error (118, "sch_debug", NULL, 0);
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* _up COMMAND : pop structure from the stack. Call */
|
||||
/* read_field to read the structure on the top of stack */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case _up_DFN :
|
||||
if (wrdcnt == 1)
|
||||
{
|
||||
pop (&stkpnt, 1);
|
||||
readflg = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((wrdcnt == 2) && (flags [1] == 1))
|
||||
{
|
||||
pop (&stkpnt, nmbrs [1] + 1);
|
||||
readflg = 1;
|
||||
}
|
||||
else
|
||||
sch_error (118, "sch_debug", NULL, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* _save COMMAND : save the structure on the top of stack in */
|
||||
/* the jump table */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case _save_DFN :
|
||||
if ((wrdcnt == 2) && (flags [1] == 1) && (nmbrs [1] < 10))
|
||||
jtab [nmbrs[1]] = stk [stkpnt];
|
||||
else
|
||||
sch_error (118, "sch_debug", NULL, 0);
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* _display COMMAND : display a specified field as an */
|
||||
/* immediate */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case _display_DFN :
|
||||
if ((wrdcnt == 3) && (indxs [1] != _error_DFN))
|
||||
disp_immd (str, pnt [indxs [1]], indxs [2]);
|
||||
else
|
||||
sch_error (118, "sch_debug", NULL, 0);
|
||||
break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* POINTERS ... */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case POINTER_DFN :
|
||||
if (idx == next_DFN)
|
||||
{
|
||||
if ((wrdcnt == 1) || ((wrdcnt == 2) && (flags [1] == 0)))
|
||||
{
|
||||
push (stk, &stkpnt, pnt [idx].dat, pshtype);
|
||||
readflg = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (((wrdcnt == 3) || (wrdcnt == 2)) && (flags [1] == 1))
|
||||
{
|
||||
pnt [idx].dat = (void *) go_forward (pnt [idx].dat, nmbrs [1]);
|
||||
push (stk, &stkpnt, pnt [idx].dat, pshtype);
|
||||
readflg = 1;
|
||||
}
|
||||
else
|
||||
sch_error (118, "sch_debug", NULL, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
push (stk, &stkpnt, pnt [idx].dat, pshtype);
|
||||
readflg = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* ARRAIES of structure */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case ARRAY_DFN :
|
||||
if ((wrdcnt > 1) && (flags [1] == 1))
|
||||
{
|
||||
size = siz [(typ [idx] & TYPE_DFN)];
|
||||
pntr = (void *)
|
||||
(((unsigned int) pnt [idx].dat) + (size * nmbrs [1]));
|
||||
push (stk, &stkpnt, pntr, pshtype);
|
||||
readflg = 1;
|
||||
}
|
||||
else
|
||||
sch_error (118, "sch_debug", NULL, 0);
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* ARRAIES of pointers */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case ARYOFPNT_DFN :
|
||||
if ((wrdcnt > 1) && (flags [1] == 1))
|
||||
{
|
||||
size = sizeof (void *);
|
||||
pntr = * (void **)
|
||||
(((unsigned int) pnt [idx].dat) + (size * nmbrs [1]));
|
||||
push (stk, &stkpnt, pntr, pshtype);
|
||||
readflg = 1;
|
||||
}
|
||||
else
|
||||
sch_error (118, "sch_debug", NULL, 0);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if (readflg == 1)
|
||||
{
|
||||
readflg = 0;
|
||||
read_field (stk [stkpnt], pnt, typ, str);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
printf ("\n\nCOMMAND > ");
|
||||
|
||||
gets (line);
|
||||
if (strcmp (line ,"."))
|
||||
{
|
||||
wrdcnt = splitline (words, line);
|
||||
idx = translate (words, wrdcnt, str, nmbrs, flags, indxs);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : read_field */
|
||||
/* description : read the content of a data structure */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void read_field (curpnt, pnt, typ, str)
|
||||
|
||||
struct stack curpnt; /* current struct. to be read */
|
||||
union value *pnt ; /* child structures or data */
|
||||
long *typ ; /* child struct. or data type */
|
||||
char **str ; /* recognized strings */
|
||||
|
||||
{
|
||||
unsigned int i ;
|
||||
|
||||
struct shdul *shdul_pnt ;
|
||||
struct shent *shent_pnt ;
|
||||
struct shtra *shtra_pnt ;
|
||||
struct shwav *shwav_pnt ;
|
||||
|
||||
char **string_pnt;
|
||||
char *character_pnt;
|
||||
int *integer_pnt;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* initialization */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
for (i=0 ; i<MAXCMD_DFN ; i++)
|
||||
{
|
||||
typ [i] = _error_DFN;
|
||||
pnt [i].dat = NULL;
|
||||
}
|
||||
|
||||
typ [_exit_DFN] = COMMAND_DFN | _exit_DFN ;
|
||||
typ [_up_DFN] = COMMAND_DFN | _up_DFN ;
|
||||
typ [_top_DFN] = COMMAND_DFN | _top_DFN ;
|
||||
typ [_stop_DFN] = COMMAND_DFN | _stop_DFN ;
|
||||
typ [_back_DFN] = COMMAND_DFN | _back_DFN ;
|
||||
typ [_jump_DFN] = COMMAND_DFN | _jump_DFN ;
|
||||
typ [_save_DFN] = COMMAND_DFN | _save_DFN ;
|
||||
typ [_display_DFN] = COMMAND_DFN | _display_DFN;
|
||||
|
||||
switch (curpnt.type & TYPE_DFN)
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* depending on the type of the current structure : */
|
||||
/* */
|
||||
/* - define the type of each field : */
|
||||
/* - the field contains an immediate or a pointer */
|
||||
/* - what format must be used to print it */
|
||||
/* - kind of data it contains */
|
||||
/* */
|
||||
/* - register the data contained in the field */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* shdul */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case shdul_DFN :
|
||||
|
||||
shdul_pnt = (struct shdul *) curpnt.data;
|
||||
|
||||
typ [next_DFN] = POINTER_DFN | s_DFN | shdul_DFN ;
|
||||
typ [label_DFN] = POINTER_DFN | s_DFN | void_DFN ;
|
||||
typ [ttable_DFN] = ARYOFPNT_DFN | s_DFN | shent_DFN ;
|
||||
typ [itable_DFN] = ARYOFPNT_DFN | s_DFN | shwav_DFN ;
|
||||
typ [curtime_DFN] = IMMEDIATE_DFN | u_DFN | integer_DFN;
|
||||
|
||||
pnt [next_DFN].dat = shdul_pnt->NEXT ;
|
||||
pnt [label_DFN].dat = shdul_pnt->LABEL ;
|
||||
pnt [ttable_DFN].dat = shdul_pnt->TTABLE ;
|
||||
pnt [itable_DFN].dat = shdul_pnt->ITABLE ;
|
||||
pnt [curtime_DFN].imd = shdul_pnt->CURTIME;
|
||||
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* shtra */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case shtra_DFN :
|
||||
|
||||
shtra_pnt = (struct shtra *) curpnt.data;
|
||||
|
||||
typ [next_DFN] = POINTER_DFN | s_DFN | shtra_DFN ;
|
||||
typ [prev_DFN] = POINTER_DFN | s_DFN | void_DFN ;
|
||||
typ [wave_DFN] = POINTER_DFN | s_DFN | shtra_DFN ;
|
||||
typ [date_DFN] = IMMEDIATE_DFN | u_DFN | integer_DFN ;
|
||||
typ [ident_DFN] = POINTER_DFN | s_DFN | void_DFN ;
|
||||
typ [scdid_DFN] = POINTER_DFN | s_DFN | void_DFN ;
|
||||
typ [uflag_DFN] = IMMEDIATE_DFN | x_DFN | integer_DFN ;
|
||||
typ [cond_DFN] = IMMEDIATE_DFN | x_DFN | character_DFN;
|
||||
typ [valu_DFN] = IMMEDIATE_DFN | x_DFN | character_DFN;
|
||||
typ [flags_DFN] = IMMEDIATE_DFN | x_DFN | short_DFN ;
|
||||
|
||||
pnt [next_DFN].dat = shtra_pnt->NEXT ;
|
||||
pnt [prev_DFN].dat = shtra_pnt->PREV ;
|
||||
pnt [wave_DFN].dat = shtra_pnt->WAVE ;
|
||||
pnt [date_DFN].imd = shtra_pnt->DATE ;
|
||||
pnt [ident_DFN].dat = shtra_pnt->IDENT;
|
||||
pnt [scdid_DFN].dat = shtra_pnt->SCDID;
|
||||
pnt [uflag_DFN].imd = shtra_pnt->UFLAG;
|
||||
pnt [cond_DFN].imd = shtra_pnt->COND ;
|
||||
pnt [valu_DFN].imd = shtra_pnt->VALU ;
|
||||
pnt [flags_DFN].imd = shtra_pnt->FLAGS;
|
||||
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* shwav */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case shwav_DFN :
|
||||
|
||||
shwav_pnt = (struct shwav *) curpnt.data;
|
||||
|
||||
typ [next_DFN] = POINTER_DFN | s_DFN | shwav_DFN ;
|
||||
typ [ident_DFN] = POINTER_DFN | s_DFN | void_DFN ;
|
||||
typ [trans_DFN] = POINTER_DFN | s_DFN | shtra_DFN ;
|
||||
|
||||
pnt [next_DFN].dat = shwav_pnt->NEXT ;
|
||||
pnt [ident_DFN].dat = shwav_pnt->IDENT;
|
||||
pnt [trans_DFN].dat = shwav_pnt->TRANS;
|
||||
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* shent */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case shent_DFN :
|
||||
|
||||
shent_pnt = (struct shent *) curpnt.data;
|
||||
|
||||
typ [next_DFN] = POINTER_DFN | s_DFN | shent_DFN ;
|
||||
typ [date_DFN] = IMMEDIATE_DFN | u_DFN | integer_DFN;
|
||||
typ [trans_DFN] = ARYOFPNT_DFN | s_DFN | shtra_DFN ;
|
||||
|
||||
pnt [next_DFN].dat = shent_pnt->NEXT;
|
||||
pnt [date_DFN].imd = shent_pnt->DATE;
|
||||
pnt [trans_DFN].dat = shent_pnt->TRANS;
|
||||
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* string */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case string_DFN :
|
||||
|
||||
string_pnt = (char **) curpnt.data;
|
||||
|
||||
typ [string_DFN] = IMMEDIATE_DFN | s_DFN | string_DFN;
|
||||
pnt [string_DFN].dat = *string_pnt;
|
||||
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* character */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case character_DFN :
|
||||
|
||||
character_pnt = (char *) curpnt.data;
|
||||
|
||||
typ [character_DFN] = IMMEDIATE_DFN | x_DFN | character_DFN;
|
||||
pnt [character_DFN].imd = *character_pnt;
|
||||
|
||||
break;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* integer */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
case integer_DFN :
|
||||
|
||||
integer_pnt = (int *) curpnt.data;
|
||||
|
||||
typ [integer_DFN] = IMMEDIATE_DFN | d_DFN | integer_DFN;
|
||||
pnt [integer_DFN].imd = *integer_pnt;
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* scan the list of recongnized strings to print those */
|
||||
/* values that are not empty (different form _error_DFN) : */
|
||||
/* */
|
||||
/* - if it contains an immediate, print it following the */
|
||||
/* required format */
|
||||
/* */
|
||||
/* - if it contains a pointer, just print the pointer */
|
||||
/* indication, ->, and "availbale" */
|
||||
/* */
|
||||
/* - if it contains an array, just print the array */
|
||||
/* indication, =>, and "availbale" */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
printf ("--------- current structure : %s ---------\n\n",
|
||||
str [curpnt.type & TYPE_DFN]);
|
||||
|
||||
for (i=0 ; i<MAXCMD_DFN ; i++)
|
||||
{
|
||||
if ((typ [i] & KIND_DFN) == IMMEDIATE_DFN)
|
||||
{
|
||||
printf (" %-15s: ", str [i]);
|
||||
switch (typ [i] & FORMAT_DFN)
|
||||
{
|
||||
case s_DFN :
|
||||
if (pnt[i].dat != NULL)
|
||||
printf ("%s", pnt[i].dat);
|
||||
printf ("\n");
|
||||
break;
|
||||
|
||||
case f_DFN :
|
||||
printf ("%f\n", pnt[i].imd);
|
||||
break;
|
||||
|
||||
case u_DFN :
|
||||
printf ("%u\n", pnt[i].imd);
|
||||
break;
|
||||
|
||||
case c_DFN :
|
||||
printf ("%c\n", pnt[i].imd);
|
||||
break;
|
||||
|
||||
case d_DFN :
|
||||
printf ("%d\n", pnt[i].imd);
|
||||
break;
|
||||
|
||||
case l_DFN :
|
||||
printf ("%ld\n", pnt[i].imd);
|
||||
break;
|
||||
|
||||
case x_DFN :
|
||||
printf ("0x%x\n", pnt[i].imd);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if ((typ [i] & KIND_DFN) == POINTER_DFN)
|
||||
{
|
||||
printf ("-> %-15s: ", str [i]);
|
||||
if (pnt[i].dat != NULL)
|
||||
printf ("available");
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
if ( ((typ [i] & KIND_DFN) == ARRAY_DFN ) ||
|
||||
((typ [i] & KIND_DFN) == ARYOFPNT_DFN) )
|
||||
{
|
||||
printf ("=> %-15s: ", str [i]);
|
||||
if (pnt[i].dat != NULL)
|
||||
printf ("available");
|
||||
printf ("\n");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : splitline */
|
||||
/* description : read a line (the space must have been reserved by the */
|
||||
/* caller - *words) from the standard input and split it */
|
||||
/* into seperate words. Return the number of words read. */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static int splitline (words, line)
|
||||
|
||||
char **words;
|
||||
char *line ;
|
||||
{
|
||||
|
||||
char *heap = *words;
|
||||
int new = 1;
|
||||
int wrdcnt = 0;
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* copy the line read from input into the words until a */
|
||||
/* space has been found. Then, increment the word count and */
|
||||
/* begin filling the next word */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
while ((heap[j] = line[i++]) != '\0')
|
||||
{
|
||||
if ((heap[j] != ' ') && (heap[j] != '\t'))
|
||||
{
|
||||
new = 0;
|
||||
j++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (new != 1)
|
||||
{
|
||||
heap [j++] = '\0';
|
||||
words [++wrdcnt] = heap + j;
|
||||
new = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (new != 1)
|
||||
wrdcnt++;
|
||||
|
||||
return (wrdcnt);
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : push */
|
||||
/* description : push a structure on the stack */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void push (stk, stkpnt, data, type)
|
||||
|
||||
struct stack *stk;
|
||||
int *stkpnt;
|
||||
void *data;
|
||||
short type;
|
||||
|
||||
{
|
||||
int stkidx = *stkpnt;
|
||||
|
||||
if (stkidx == STKSIZ_DFN)
|
||||
sch_message (20, "sch_debug", 0);
|
||||
else
|
||||
{
|
||||
if (data != NULL)
|
||||
{
|
||||
stkidx++;
|
||||
stk [stkidx].data = data;
|
||||
stk [stkidx].type = type;
|
||||
stk [stkidx].mark = 0;
|
||||
*stkpnt = stkidx;
|
||||
}
|
||||
else
|
||||
sch_error (120, "sch_debug", NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : pop */
|
||||
/* description : pop N structures from the stack */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void pop (stkpnt, count)
|
||||
|
||||
int *stkpnt;
|
||||
int count;
|
||||
|
||||
{
|
||||
int stkidx = *stkpnt;
|
||||
|
||||
if (stkidx <= count)
|
||||
stkidx = 0;
|
||||
else
|
||||
stkidx -= count;
|
||||
|
||||
*stkpnt = stkidx;
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : go_forward */
|
||||
/* description : go forward through the NEXT field to find the Nth */
|
||||
/* structure in the list and return it */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static struct chain *go_forward (pnt, count)
|
||||
|
||||
struct chain *pnt ;
|
||||
int count;
|
||||
|
||||
{
|
||||
while ((count > 0) && (pnt != NULL) && (pnt->NEXT != NULL))
|
||||
{
|
||||
pnt = pnt->NEXT;
|
||||
count--;
|
||||
}
|
||||
return (pnt);
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : translate */
|
||||
/* description : find the index of each word read from the command */
|
||||
/* line. For each word check if it is a number. Return */
|
||||
/* the index of the first word. */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static int translate (words, wrdcnt, strgs, nmbrs, flags, indxs)
|
||||
|
||||
char **words ; /* list of words */
|
||||
int wrdcnt; /* number of words */
|
||||
char **strgs ; /* list of recognized strings */
|
||||
int *nmbrs ; /* words translated to numbers */
|
||||
char *flags ; /* set if word is a number */
|
||||
int *indxs ; /* words' index in strgs table */
|
||||
|
||||
{
|
||||
int i , j;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* initialize flags and indxs */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
for (i=0 ; i<10 ; i++)
|
||||
{
|
||||
flags [i] = 0;
|
||||
indxs [i] = _error_DFN;
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* for each word : */
|
||||
/* - check if it is a number */
|
||||
/* - try to locate the word among the recognized strings. */
|
||||
/* If found save it's index */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
for (i=0 ; i<wrdcnt ; i++)
|
||||
{
|
||||
flags [i] = sscanf (words [i], "%u", &nmbrs [i]);
|
||||
for (j=0; j<MAXCMD_DFN ; j++)
|
||||
{
|
||||
if (!strcmp (strgs [j], words [i]))
|
||||
{
|
||||
indxs [i] = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return (indxs [0]);
|
||||
}
|
||||
|
||||
static void get_size (siz)
|
||||
|
||||
unsigned int siz [];
|
||||
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0 ; i<MAXCMD_DFN ; i++)
|
||||
siz [i] = 0;
|
||||
|
||||
|
||||
siz [character_DFN] = sizeof (char);
|
||||
siz [short_DFN] = sizeof (short);
|
||||
siz [integer_DFN] = sizeof (int);
|
||||
siz [long_DFN] = sizeof (long);
|
||||
siz [string_DFN] = sizeof (char *);
|
||||
|
||||
siz [shent_DFN] = sizeof (struct shent);
|
||||
siz [shwav_DFN] = sizeof (struct shwav);
|
||||
siz [shtra_DFN] = sizeof (struct shtra);
|
||||
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : disp_immd */
|
||||
/* description : display a specific field as an immediate */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static void disp_immd (str, pnt , type)
|
||||
|
||||
char **str;
|
||||
union value pnt ;
|
||||
int type ;
|
||||
|
||||
{
|
||||
char *lcl_str;
|
||||
|
||||
printf (" %-15s: ", str [type]);
|
||||
switch (type)
|
||||
{
|
||||
case string_DFN :
|
||||
if (((char *) pnt.dat) != NULL)
|
||||
printf ("%s", (char *) pnt.dat);
|
||||
printf ("\n");
|
||||
break;
|
||||
|
||||
case float_DFN :
|
||||
printf ("%f\n", pnt.imd);
|
||||
break;
|
||||
|
||||
case character_DFN :
|
||||
printf ("%c\n", pnt.imd);
|
||||
break;
|
||||
|
||||
case short_DFN :
|
||||
case integer_DFN :
|
||||
case long_DFN :
|
||||
printf ("0x%x\n", pnt.imd);
|
||||
break;
|
||||
|
||||
default :
|
||||
sch_error (118, "sch_debug", NULL, 0);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_debug.h */
|
||||
/* date : Aug 10 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* description : declaration of diefines, global variables and, */
|
||||
/* functions used in the debugger */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct stack /* debugger's stack's structure */
|
||||
{
|
||||
short type; /* type of the current ponter */
|
||||
short mark; /* stop mark */
|
||||
void *data; /* current pointer */
|
||||
};
|
||||
|
||||
union value
|
||||
{
|
||||
void *dat;
|
||||
long imd;
|
||||
};
|
||||
|
||||
#define STKSIZ_DFN 500 /* debugger's stack size */
|
||||
|
||||
#define KIND_DFN 0xff000000
|
||||
#define COMMAND_DFN 0x01000000
|
||||
#define IMMEDIATE_DFN 0x02000000
|
||||
#define POINTER_DFN 0x03000000
|
||||
#define ARRAY_DFN 0x04000000
|
||||
#define ARYOFPNT_DFN 0x05000000
|
||||
|
||||
#define FORMAT_DFN 0x00ff0000
|
||||
#define s_DFN 0x00010000
|
||||
#define u_DFN 0x00020000
|
||||
#define d_DFN 0x00030000
|
||||
#define l_DFN 0x00040000
|
||||
#define x_DFN 0x00050000
|
||||
#define c_DFN 0x00060000
|
||||
#define f_DFN 0x00070000
|
||||
|
||||
#define _error_DFN 0x0000ffff
|
||||
|
||||
#define TYPE_DFN 0x0000ffff
|
||||
#define _back_DFN 0
|
||||
#define _exit_DFN _back_DFN + 1
|
||||
#define _jump_DFN _exit_DFN + 1
|
||||
#define _save_DFN _jump_DFN + 1
|
||||
#define _stop_DFN _save_DFN + 1
|
||||
#define _top_DFN _stop_DFN + 1
|
||||
#define _up_DFN _top_DFN + 1
|
||||
#define _display_DFN _up_DFN + 1
|
||||
|
||||
#define character_DFN _display_DFN + 1
|
||||
#define short_DFN character_DFN + 1
|
||||
#define integer_DFN short_DFN + 1
|
||||
#define long_DFN integer_DFN + 1
|
||||
#define float_DFN long_DFN + 1
|
||||
#define void_DFN float_DFN + 1
|
||||
#define string_DFN void_DFN + 1
|
||||
|
||||
#define shdul_DFN string_DFN + 1
|
||||
#define shent_DFN shdul_DFN + 1
|
||||
#define shtra_DFN shent_DFN + 1
|
||||
#define shwav_DFN shtra_DFN + 1
|
||||
|
||||
#define cond_DFN shwav_DFN + 1
|
||||
#define curtime_DFN cond_DFN + 1
|
||||
#define date_DFN curtime_DFN + 1
|
||||
#define flags_DFN date_DFN + 1
|
||||
#define ident_DFN flags_DFN + 1
|
||||
#define itable_DFN ident_DFN + 1
|
||||
#define label_DFN itable_DFN + 1
|
||||
#define next_DFN label_DFN + 1
|
||||
#define prev_DFN next_DFN + 1
|
||||
#define scdid_DFN prev_DFN + 1
|
||||
#define trans_DFN scdid_DFN + 1
|
||||
#define ttable_DFN trans_DFN + 1
|
||||
#define uflag_DFN ttable_DFN + 1
|
||||
#define valu_DFN uflag_DFN + 1
|
||||
#define wave_DFN valu_DFN + 1
|
||||
|
||||
#define MAXCMD_DFN wave_DFN + 1
|
|
@ -0,0 +1,44 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_error.c */
|
||||
/* date : Aug 10 1997 */
|
||||
/* version : v101 */
|
||||
/* authors : Nizar ABDALLAH, Pirouz BAZARGAN SABET */
|
||||
/* content : high level function */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_error */
|
||||
/* description : print an error message depending on the argument code */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
int sch_error (code, str1, str2)
|
||||
|
||||
int code;
|
||||
char *str1;
|
||||
char *str2;
|
||||
|
||||
{
|
||||
fprintf (stderr,"Error %d in `%s`:", code, str1);
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case 118:
|
||||
fprintf (stderr,"command not understood\n");
|
||||
break;
|
||||
case 119:
|
||||
fprintf (stderr,"cannot display VOID pointer\n");
|
||||
break;
|
||||
case 120:
|
||||
fprintf (stderr,"cannot push NULL pointer\n");
|
||||
break;
|
||||
default:
|
||||
fprintf (stderr,"unknown error code\n");
|
||||
break;
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_globals.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
struct shtra *SCH_FREE_SHTRA = NULL;
|
||||
struct shent *SCH_FREE_SHENT = NULL;
|
||||
struct shwav *SCH_FREE_SHWAV = NULL;
|
||||
|
||||
struct shent **SCH_TIME_ENTRY = NULL;
|
||||
struct shwav **SCH_IDENT_ENTRY = NULL;
|
|
@ -0,0 +1,29 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_hash.c */
|
||||
/* date : Aug 10 1997 */
|
||||
/* version : v101 */
|
||||
/* authors : Nizar ABDALLAH, Pirouz BAZARGAN SABET */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_hash */
|
||||
/* description : return a hash code */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
unsigned int sch_hash (ident)
|
||||
|
||||
void *ident;
|
||||
|
||||
{
|
||||
unsigned int index;
|
||||
|
||||
index = (unsigned int) ident;
|
||||
index = (((index >> 2) ^ (index >> 10)) + (index >> 12) + (index >> 20));
|
||||
index &= index & 0x000000ff;
|
||||
|
||||
return (index);
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_insentry.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_insentry */
|
||||
/* description : insert a new transaction into the scheduler (time */
|
||||
/* access) */
|
||||
/* called func. : sch_addshent */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void sch_insentry (pt_shdul, pt_shtra)
|
||||
|
||||
struct shdul *pt_shdul;
|
||||
struct shtra *pt_shtra;
|
||||
|
||||
{
|
||||
struct shent *pt_shent ;
|
||||
struct shent *pt_prvent ;
|
||||
unsigned int time_window;
|
||||
unsigned int wind_number;
|
||||
unsigned int wind_offset;
|
||||
|
||||
time_window = (pt_shtra->DATE >> 3) & 0x000000ff;
|
||||
wind_number = (pt_shtra->DATE >> 11) & 0x001fffff;
|
||||
wind_offset = (pt_shtra->DATE ) & 0x00000007;
|
||||
|
||||
pt_shent = pt_shdul->TTABLE [time_window];
|
||||
|
||||
if ((pt_shent == NULL) || (pt_shent->DATE > wind_number))
|
||||
{
|
||||
pt_shdul->TTABLE [time_window] = sch_addshent (pt_shent, wind_number);
|
||||
pt_shent = pt_shdul->TTABLE [time_window];
|
||||
}
|
||||
else
|
||||
{
|
||||
pt_prvent = pt_shent;
|
||||
|
||||
while ((pt_shent != NULL) && (pt_shent->DATE < wind_number))
|
||||
{
|
||||
pt_prvent = pt_shent ;
|
||||
pt_shent = pt_shent->NEXT;
|
||||
}
|
||||
|
||||
if ((pt_shent == NULL) || (pt_shent->DATE > wind_number))
|
||||
{
|
||||
pt_shent = sch_addshent (pt_shent, wind_number);
|
||||
pt_prvent->NEXT = pt_shent;
|
||||
}
|
||||
}
|
||||
|
||||
pt_shtra->FLAGS |= SCH_TRA_ENTFIRST;
|
||||
pt_shtra->PREV = (struct shtra *) pt_shent;
|
||||
|
||||
pt_shtra->NEXT = pt_shent->TRANS [wind_offset] ;
|
||||
|
||||
if (pt_shtra->NEXT != NULL)
|
||||
{
|
||||
pt_shtra->NEXT->FLAGS ^= SCH_TRA_ENTFIRST ;
|
||||
pt_shtra->NEXT->PREV = (void *) pt_shtra;
|
||||
}
|
||||
|
||||
pt_shent->TRANS [wind_offset] = pt_shtra;
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_inswave.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_inswave */
|
||||
/* description : insert a new transaction into the scheduler (main */
|
||||
/* identifier access) */
|
||||
/* called func. : sch_rmventry */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void sch_inswave (pt_shdul, pt_shtra, flags)
|
||||
|
||||
struct shdul *pt_shdul;
|
||||
struct shtra *pt_shtra;
|
||||
unsigned short flags ;
|
||||
|
||||
{
|
||||
struct shtra *pt_afttra;
|
||||
struct shtra *pt_deltra;
|
||||
struct shtra *pt_lsttra;
|
||||
struct shtra *pt_tmptra;
|
||||
struct shwav *pt_shwav ;
|
||||
unsigned int index ;
|
||||
|
||||
index = sch_hash (pt_shtra->IDENT);
|
||||
pt_shwav = pt_shdul->ITABLE [index];
|
||||
|
||||
while ((pt_shwav != NULL) && (pt_shwav->IDENT != pt_shtra->IDENT))
|
||||
pt_shwav = pt_shwav->NEXT;
|
||||
|
||||
if (pt_shwav == NULL)
|
||||
{
|
||||
pt_shwav = sch_addshwav (pt_shdul->ITABLE [index],
|
||||
pt_shtra->IDENT );
|
||||
pt_shdul->ITABLE [index] = pt_shwav;
|
||||
}
|
||||
|
||||
pt_lsttra = NULL;
|
||||
pt_deltra = NULL;
|
||||
pt_afttra = pt_shwav->TRANS;
|
||||
while ((pt_afttra != NULL) && (pt_afttra->DATE < pt_shtra->DATE))
|
||||
{
|
||||
pt_lsttra = pt_afttra;
|
||||
if ((pt_afttra->COND != pt_shtra->COND) ||
|
||||
(pt_afttra->VALU != pt_shtra->VALU) )
|
||||
pt_deltra = pt_afttra;
|
||||
|
||||
pt_afttra = pt_afttra->WAVE;
|
||||
}
|
||||
|
||||
if ((flags & SCH_TRA_DELAFTER) != 0)
|
||||
{
|
||||
while (pt_afttra != NULL)
|
||||
pt_afttra = sch_rmventry (pt_afttra);
|
||||
}
|
||||
|
||||
if (pt_lsttra != NULL)
|
||||
pt_lsttra->WAVE = pt_shtra;
|
||||
else
|
||||
pt_shwav->TRANS = pt_shtra;
|
||||
|
||||
pt_shtra->WAVE = pt_afttra;
|
||||
|
||||
if ((pt_deltra != NULL) && ((flags & SCH_TRA_DELBEFORE) != 0))
|
||||
{
|
||||
pt_tmptra = pt_shwav->TRANS;
|
||||
while (pt_tmptra != pt_deltra)
|
||||
pt_tmptra = sch_rmventry (pt_tmptra);
|
||||
|
||||
pt_shwav->TRANS = sch_rmventry (pt_tmptra);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_message.c */
|
||||
/* date : Aug 10 1997 */
|
||||
/* version : v101 */
|
||||
/* authors : Nizar ABDALLAH, Pirouz BAZARGAN SABET */
|
||||
/* content : high level function */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_message */
|
||||
/* description : print a message corresponding to the argument code */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void sch_message (code, str1, nmb1)
|
||||
|
||||
int code;
|
||||
char *str1;
|
||||
int nmb1;
|
||||
|
||||
{
|
||||
fprintf (stdout, "`%s` :", str1);
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case 19:
|
||||
fprintf (stdout, "stop mark on current structure\n");
|
||||
break;
|
||||
case 20:
|
||||
fprintf (stdout, "--- STACK OVERFLOW !! ---\n");
|
||||
break;
|
||||
default:
|
||||
fprintf (stderr,"unknown code %d\n", code);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : sch_rmventry.c */
|
||||
/* date : Aug 5 1997 */
|
||||
/* version : v101 */
|
||||
/* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */
|
||||
/* description : scheduler */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "sch.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : sch_rmventry */
|
||||
/* description : remove a transaction from the time entry of the */
|
||||
/* scheduler */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct shtra *sch_rmventry (pt_shtra)
|
||||
|
||||
struct shtra *pt_shtra;
|
||||
|
||||
{
|
||||
struct shent *pt_shent ;
|
||||
struct shtra *pt_nxttra ;
|
||||
unsigned int wind_offset;
|
||||
|
||||
pt_nxttra = pt_shtra->WAVE;
|
||||
|
||||
if ((pt_shtra->FLAGS & SCH_TRA_ENTFIRST) != 0)
|
||||
{
|
||||
pt_shent = (struct shent *) pt_shtra->PREV;
|
||||
|
||||
wind_offset = pt_shtra->DATE & 0x00000007;
|
||||
pt_shent->TRANS [wind_offset] = pt_shtra->NEXT;
|
||||
|
||||
if (pt_shtra->NEXT != NULL)
|
||||
{
|
||||
pt_shtra->NEXT->FLAGS |= SCH_TRA_ENTFIRST ;
|
||||
pt_shtra->NEXT->PREV = (struct shtra *) pt_shent;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pt_shtra->PREV->NEXT = pt_shtra->NEXT;
|
||||
|
||||
if (pt_shtra->NEXT != NULL)
|
||||
pt_shtra->NEXT->PREV = pt_shtra->PREV;
|
||||
}
|
||||
|
||||
pt_shtra->NEXT = SCH_FREE_SHTRA;
|
||||
SCH_FREE_SHTRA = pt_shtra ;
|
||||
|
||||
return (pt_nxttra);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,205 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : vh_debug.h */
|
||||
/* date : Aug 20 1997 */
|
||||
/* version : v3.0 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* description : declaration of diefines, global variables and, */
|
||||
/* functions used in the debugger */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct stack /* debugger's stack's structure */
|
||||
{
|
||||
short type; /* type of the current ponter */
|
||||
short mark; /* stop mark */
|
||||
void *data; /* current pointer */
|
||||
};
|
||||
|
||||
union value
|
||||
{
|
||||
void *dat;
|
||||
long imd;
|
||||
};
|
||||
|
||||
#define STKSIZ_DFN 500 /* debugger's stack size */
|
||||
|
||||
#define KIND_DFN 0xff000000
|
||||
#define COMMAND_DFN 0x01000000
|
||||
#define IMMEDIATE_DFN 0x02000000
|
||||
#define POINTER_DFN 0x03000000
|
||||
#define ARRAY_DFN 0x04000000
|
||||
#define ARYOFPNT_DFN 0x05000000
|
||||
|
||||
#define FORMAT_DFN 0x00ff0000
|
||||
#define s_DFN 0x00010000
|
||||
#define u_DFN 0x00020000
|
||||
#define d_DFN 0x00030000
|
||||
#define l_DFN 0x00040000
|
||||
#define x_DFN 0x00050000
|
||||
#define c_DFN 0x00060000
|
||||
#define f_DFN 0x00070000
|
||||
#define ABL_DFN 0x00080000
|
||||
#define BDD_DFN 0x00090000
|
||||
#define GEX_DFN 0x000a0000
|
||||
|
||||
#define _error_DFN 0x0000ffff
|
||||
|
||||
#define TYPE_DFN 0x0000ffff
|
||||
#define _back_DFN 0
|
||||
#define _exit_DFN (_back_DFN + 1)
|
||||
#define _jump_DFN (_exit_DFN + 1)
|
||||
#define _save_DFN (_jump_DFN + 1)
|
||||
#define _stop_DFN (_save_DFN + 1)
|
||||
#define _top_DFN (_stop_DFN + 1)
|
||||
#define _up_DFN (_top_DFN + 1)
|
||||
#define _display_DFN (_up_DFN + 1)
|
||||
|
||||
#define character_DFN (_display_DFN + 1)
|
||||
#define short_DFN (character_DFN + 1)
|
||||
#define integer_DFN (short_DFN + 1)
|
||||
#define long_DFN (integer_DFN + 1)
|
||||
#define float_DFN (long_DFN + 1)
|
||||
#define void_DFN (float_DFN + 1)
|
||||
#define string_DFN (void_DFN + 1)
|
||||
|
||||
#define chain_DFN (string_DFN + 1)
|
||||
#define ptype_DFN (chain_DFN + 1)
|
||||
|
||||
#define lofig_DFN (ptype_DFN + 1)
|
||||
#define locon_DFN (lofig_DFN + 1)
|
||||
#define losig_DFN (locon_DFN + 1)
|
||||
#define loins_DFN (losig_DFN + 1)
|
||||
|
||||
#define befig_DFN (loins_DFN + 1)
|
||||
#define bereg_DFN (befig_DFN + 1)
|
||||
#define bemsg_DFN (bereg_DFN + 1)
|
||||
#define berin_DFN (bemsg_DFN + 1)
|
||||
#define beout_DFN (berin_DFN + 1)
|
||||
#define bebus_DFN (beout_DFN + 1)
|
||||
#define beaux_DFN (bebus_DFN + 1)
|
||||
#define bedly_DFN (beaux_DFN + 1)
|
||||
#define bebux_DFN (bedly_DFN + 1)
|
||||
#define bepor_DFN (bebux_DFN + 1)
|
||||
#define begen_DFN (bepor_DFN + 1)
|
||||
#define biabl_DFN (begen_DFN + 1)
|
||||
#define binode_DFN (biabl_DFN + 1)
|
||||
|
||||
#define paseq_DFN (binode_DFN + 1)
|
||||
#define pagrp_DFN (paseq_DFN + 1)
|
||||
#define paiol_DFN (pagrp_DFN + 1)
|
||||
#define papat_DFN (paiol_DFN + 1)
|
||||
#define pacom_DFN (papat_DFN + 1)
|
||||
#define paini_DFN (pacom_DFN + 1)
|
||||
#define paevt_DFN (paini_DFN + 1)
|
||||
#define pains_DFN (paevt_DFN + 1)
|
||||
|
||||
#define bussig_DFN (pains_DFN + 1)
|
||||
#define lkdfig_DFN (bussig_DFN + 1)
|
||||
#define lkdins_DFN (lkdfig_DFN + 1)
|
||||
#define simsig_DFN (lkdins_DFN + 1)
|
||||
#define wrbsig_DFN (simsig_DFN + 1)
|
||||
#define wriaux_DFN (wrbsig_DFN + 1)
|
||||
#define wribux_DFN (wriaux_DFN + 1)
|
||||
#define wrireg_DFN (wribux_DFN + 1)
|
||||
#define wrssig_DFN (wrireg_DFN + 1)
|
||||
#define wrimsg_DFN (wrssig_DFN + 1)
|
||||
|
||||
#define shdul_DFN (wrimsg_DFN + 1)
|
||||
#define shent_DFN (shdul_DFN + 1)
|
||||
#define shtra_DFN (shent_DFN + 1)
|
||||
#define shwav_DFN (shtra_DFN + 1)
|
||||
|
||||
#define abl_DFN (shwav_DFN + 1)
|
||||
#define bdd_DFN (abl_DFN + 1)
|
||||
#define gex_DFN (bdd_DFN + 1)
|
||||
|
||||
#define actflag_DFN (gex_DFN + 1)
|
||||
#define aux_ref_DFN (actflag_DFN + 1)
|
||||
#define blank_DFN (aux_ref_DFN + 1)
|
||||
#define buffer_DFN (blank_DFN + 1)
|
||||
#define bus_ref_DFN (buffer_DFN + 1)
|
||||
#define bux_ref_DFN (bus_ref_DFN + 1)
|
||||
#define capa_DFN (bux_ref_DFN + 1)
|
||||
#define cndabl_DFN (capa_DFN + 1)
|
||||
#define cndnode_DFN (cndabl_DFN + 1)
|
||||
#define cndval_DFN (cndnode_DFN + 1)
|
||||
#define cond_DFN (cndval_DFN + 1)
|
||||
#define curcom_DFN (cond_DFN + 1)
|
||||
#define curpat_DFN (curcom_DFN + 1)
|
||||
#define curtime_DFN (curpat_DFN + 1)
|
||||
#define curval_DFN (curtime_DFN + 1)
|
||||
#define data_DFN (curval_DFN + 1)
|
||||
#define date_DFN (data_DFN + 1)
|
||||
#define deccom_DFN (date_DFN + 1)
|
||||
#define depend_DFN (deccom_DFN + 1)
|
||||
#define direction_DFN (depend_DFN + 1)
|
||||
#define dly_ref_DFN (direction_DFN + 1)
|
||||
#define drvseq_DFN (dly_ref_DFN + 1)
|
||||
#define drvval_DFN (drvseq_DFN + 1)
|
||||
#define endflg_DFN (drvval_DFN + 1)
|
||||
#define errflg_DFN (endflg_DFN + 1)
|
||||
#define eval_DFN (errflg_DFN + 1)
|
||||
#define figname_DFN (eval_DFN + 1)
|
||||
#define filname_DFN (figname_DFN + 1)
|
||||
#define findex_DFN (filname_DFN + 1)
|
||||
#define flag_DFN (findex_DFN + 1)
|
||||
#define flags_DFN (flag_DFN + 1)
|
||||
#define format_DFN (flags_DFN + 1)
|
||||
#define glnext_DFN (format_DFN + 1)
|
||||
#define ident_DFN (glnext_DFN + 1)
|
||||
#define index_DFN (ident_DFN + 1)
|
||||
#define insname_DFN (index_DFN + 1)
|
||||
#define instance_DFN (insname_DFN + 1)
|
||||
#define iolnbr_DFN (instance_DFN + 1)
|
||||
#define itable_DFN (iolnbr_DFN + 1)
|
||||
#define label_DFN (itable_DFN + 1)
|
||||
#define length_DFN (label_DFN + 1)
|
||||
#define level_DFN (length_DFN + 1)
|
||||
#define line_DFN (level_DFN + 1)
|
||||
#define lineno_DFN (line_DFN + 1)
|
||||
#define message_DFN (lineno_DFN + 1)
|
||||
#define mode_DFN (message_DFN + 1)
|
||||
#define model_DFN (mode_DFN + 1)
|
||||
#define modelchain_DFN (model_DFN + 1)
|
||||
#define msg_ref_DFN (modelchain_DFN + 1)
|
||||
#define name_DFN (msg_ref_DFN + 1)
|
||||
#define namechain_DFN (name_DFN + 1)
|
||||
#define next_DFN (namechain_DFN + 1)
|
||||
#define node_DFN (next_DFN + 1)
|
||||
#define nxtpat_DFN (node_DFN + 1)
|
||||
#define oldcom_DFN (nxtpat_DFN + 1)
|
||||
#define oldpat_DFN (oldcom_DFN + 1)
|
||||
#define out_ref_DFN (oldpat_DFN + 1)
|
||||
#define patnbr_DFN (out_ref_DFN + 1)
|
||||
#define position_DFN (patnbr_DFN + 1)
|
||||
#define prev_DFN (position_DFN + 1)
|
||||
#define prjbvl_DFN (prev_DFN + 1)
|
||||
#define prjrvl_DFN (prjbvl_DFN + 1)
|
||||
#define prjval_DFN (prjrvl_DFN + 1)
|
||||
#define redins_DFN (prjval_DFN + 1)
|
||||
#define redlst_DFN (redins_DFN + 1)
|
||||
#define reg_ref_DFN (redlst_DFN + 1)
|
||||
#define root_DFN (reg_ref_DFN + 1)
|
||||
#define savflg_DFN (root_DFN + 1)
|
||||
#define scdid_DFN (savflg_DFN + 1)
|
||||
#define sig_DFN (scdid_DFN + 1)
|
||||
#define simflag_DFN (sig_DFN + 1)
|
||||
#define simval_DFN (simflag_DFN + 1)
|
||||
#define subseq_DFN (simval_DFN + 1)
|
||||
#define text_DFN (subseq_DFN + 1)
|
||||
#define time_DFN (text_DFN + 1)
|
||||
#define time_unit_DFN (time_DFN + 1)
|
||||
#define trans_DFN (time_unit_DFN + 1)
|
||||
#define ttable_DFN (trans_DFN + 1)
|
||||
#define type_DFN (ttable_DFN + 1)
|
||||
#define uflag_DFN (type_DFN + 1)
|
||||
#define user_DFN (uflag_DFN + 1)
|
||||
#define usrval_DFN (user_DFN + 1)
|
||||
#define valabl_DFN (usrval_DFN + 1)
|
||||
#define valnode_DFN (valabl_DFN + 1)
|
||||
#define valsiz_DFN (valnode_DFN + 1)
|
||||
#define valu_DFN (valsiz_DFN + 1)
|
||||
#define value_DFN (valu_DFN + 1)
|
||||
#define wave_DFN (value_DFN + 1)
|
||||
|
||||
#define MAXCMD_DFN (wave_DFN + 1)
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
struct typoin /* structure used by dast_dbg */
|
||||
{ /* to store its state */
|
||||
short type; /* code of current structure */
|
||||
short mark; /* stop mark */
|
||||
void *data; /* pointer of the structure */
|
||||
};
|
|
@ -0,0 +1,42 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : vh_globals.c */
|
||||
/* date : Nov 15 1995 */
|
||||
/* version : v2.01 */
|
||||
/* author : Pirouz BARAGAN SABET */
|
||||
/* description : VHDL compiler and simulation tool. */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "mut.h"
|
||||
#include "mlo.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "sch.h"
|
||||
#include "vh_ltype.h"
|
||||
|
||||
struct lofig *VHS_LOFPNT = NULL;
|
||||
struct lkdfig *VHL_HEDLKF = NULL;
|
||||
struct shdul *VHX_SHDUL = NULL;
|
||||
|
||||
struct ptype *VHX_EXECUTE = NULL;
|
||||
|
||||
struct chain *VHX_SIGUPD = NULL;
|
||||
struct chain *VHX_BUSUPD = NULL;
|
||||
struct chain *VHX_BUXUPD = NULL;
|
||||
struct chain *VHX_REGUPD = NULL;
|
||||
struct chain *VHX_AUXUPD = NULL;
|
||||
|
||||
unsigned int VHX_BUSERR = 0 ;
|
||||
unsigned int VHX_BUXERR = 0 ;
|
||||
unsigned int VHX_REGERR = 0 ;
|
||||
unsigned int VHX_MSGERR = 0 ;
|
||||
|
||||
unsigned int *VHX_VECTOR_TRANS = NULL;
|
||||
unsigned char *VHX_VECTOR_VALUE = NULL;
|
||||
unsigned int *VHX_VECTOR_PROBA = NULL;
|
||||
|
||||
struct lkdmdl *VHL_MODELS = NULL;
|
||||
|
||||
unsigned char VHX_SCH_TRA_MODE = SCH_TRA_DELAFTER | SCH_TRA_DELBEFORE ;
|
|
@ -0,0 +1,35 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : vh_globals.h */
|
||||
/* date : Aug 20 1997 */
|
||||
/* version : v3.0 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* content : declaration of functions and global variables used by */
|
||||
/* the simulator */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
extern struct lofig *VHS_LOFPNT ;
|
||||
extern struct lkdfig *VHL_HEDLKF ;
|
||||
|
||||
extern struct shdul *VHX_SHDUL ;
|
||||
|
||||
extern struct ptype *VHX_EXECUTE ;
|
||||
|
||||
extern struct chain *VHX_SIGUPD ;
|
||||
extern struct chain *VHX_BUSUPD ;
|
||||
extern struct chain *VHX_BUXUPD ;
|
||||
extern struct chain *VHX_REGUPD ;
|
||||
extern struct chain *VHX_AUXUPD ;
|
||||
|
||||
extern unsigned int VHX_BUSERR ;
|
||||
extern unsigned int VHX_BUXERR ;
|
||||
extern unsigned int VHX_REGERR ;
|
||||
extern unsigned int VHX_MSGERR ;
|
||||
|
||||
extern unsigned int *VHX_VECTOR_TRANS ;
|
||||
extern unsigned char *VHX_VECTOR_VALUE ;
|
||||
extern unsigned int *VHX_VECTOR_PROBA ;
|
||||
|
||||
extern struct lkdmdl *VHL_MODELS ;
|
||||
|
||||
extern unsigned char VHX_SCH_TRA_MODE ;
|
|
@ -0,0 +1,73 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : vh_init.c */
|
||||
/* date : Dec 13 1999 */
|
||||
/* version : v3.02 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* description : this file contains the following functions */
|
||||
/* vhi_addcmodel, vhi_models */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "vh_ltype.h"
|
||||
#include "vh_globals.h"
|
||||
#include "vh_util.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : vhi_addcmodel */
|
||||
/* description : create a data structure that associate the c model's */
|
||||
/* name and the pointer of the function that represents */
|
||||
/* that C model */
|
||||
/* called func. : vhu_alloc, namealloc */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void vhi_addcmodel (str, fonc_pnt)
|
||||
|
||||
char *str ;
|
||||
void ( *fonc_pnt) ();
|
||||
|
||||
{
|
||||
struct lkdmdl *model;
|
||||
|
||||
model = (struct lkdmdl *) vhu_alloc (sizeof (struct lkdmdl), VHU_ALIGN);
|
||||
|
||||
model->NAME = namealloc (str);
|
||||
model->FONC = fonc_pnt ;
|
||||
model->NEXT = VHL_MODELS ;
|
||||
|
||||
VHL_MODELS = model;
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : vhi_models */
|
||||
/* description : declare available C models */
|
||||
/* called func. : vhi_addcmodel */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void vhi_models ()
|
||||
{
|
||||
extern void c_sr1k_8a ();
|
||||
extern void c_sr1k_8b ();
|
||||
extern void c_sr8k_8a ();
|
||||
extern void c_fsyn_sr1k_1 ();
|
||||
extern void c_fsyn_sr1k_4 ();
|
||||
extern void c_fsyn_sr1k_10 ();
|
||||
extern void c_fsyn_sr1k_24 ();
|
||||
extern void c_fsyn_sr1k_56 ();
|
||||
extern void c_fsyn_sr4k_10 ();
|
||||
extern void c_hada_repondeur ();
|
||||
|
||||
vhi_addcmodel ("c_sr1k_8a" , c_sr1k_8a );
|
||||
vhi_addcmodel ("c_sr1k_8b" , c_sr1k_8b );
|
||||
vhi_addcmodel ("c_sr8k_8a" , c_sr8k_8a );
|
||||
vhi_addcmodel ("c_fsyn_sr1k_1" , c_fsyn_sr1k_1 );
|
||||
vhi_addcmodel ("c_fsyn_sr1k_4" , c_fsyn_sr1k_4 );
|
||||
vhi_addcmodel ("c_fsyn_sr1k_10" , c_fsyn_sr1k_10 );
|
||||
vhi_addcmodel ("c_fsyn_sr1k_24" , c_fsyn_sr1k_24 );
|
||||
vhi_addcmodel ("c_fsyn_sr1k_56" , c_fsyn_sr1k_56 );
|
||||
vhi_addcmodel ("c_fsyn_sr4k_10" , c_fsyn_sr4k_10 );
|
||||
vhi_addcmodel ("c_hada_repondeur", c_hada_repondeur);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,30 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : vh_lspec.h */
|
||||
/* date : Aug 20 1997 */
|
||||
/* version : v3.0 */
|
||||
/* authors : VUONG H.N., Pirouz BAZARGAN SABET */
|
||||
/* content : contains defines, external variables and funtions used*/
|
||||
/* by the linker */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
extern struct prjbvl *vhl_addprjbvl ();
|
||||
extern struct prjrvl *vhl_addprjrvl ();
|
||||
extern struct redlst *vhl_addredlst ();
|
||||
extern struct simsig *vhl_addsimsig ();
|
||||
extern struct bussig *vhl_addbussig ();
|
||||
extern struct wrbsig *vhl_addwrbsig ();
|
||||
extern struct wrireg *vhl_addwrireg ();
|
||||
extern struct wribux *vhl_addwribux ();
|
||||
extern struct wrimsg *vhl_addwrimsg ();
|
||||
extern struct wriaux *vhl_addwriaux ();
|
||||
extern struct wrssig *vhl_addwrssig ();
|
||||
extern struct lkdfig *vhl_addlkdfig ();
|
||||
extern struct lkdins *vhl_addlkdins ();
|
||||
extern struct lkdspy *vhl_addlkdspy ();
|
||||
extern struct ptype *vhl_makdepend ();
|
||||
extern struct lofig *vhl_makgst ();
|
||||
extern int vhl_linker ();
|
||||
extern int vhl_restor ();
|
||||
extern void vhl_resord ();
|
||||
void ( *vhl_iscmodel ()) ();
|
|
@ -0,0 +1,211 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : vh_ltype.h */
|
||||
/* date : Aug 30 1996 */
|
||||
/* version : v3.0 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* contents : This file contains data structure definitions */
|
||||
/* generated by the linker */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* defines */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
#define MAD_GEXBLK 50 /* magex struct allocation size */
|
||||
|
||||
#define VHL_CMODEL 1 /* instance type : C models */
|
||||
#define VHL_VMODEL 2 /* instance type : VHDL models */
|
||||
|
||||
#define VHL_UKNDFN 8
|
||||
#define VHL_DECDFN 4
|
||||
#define VHL_REDDFN 2
|
||||
#define VHL_WRTDFN 1
|
||||
|
||||
#define VHL_MODDFN 0
|
||||
#define VHL_SIGDFN 1
|
||||
#define VHL_CNBDFN 2
|
||||
#define VHL_RNBDFN 3
|
||||
#define VHL_WNBDFN 4
|
||||
#define VHL_PNTDFN 7
|
||||
|
||||
#define VHL_LVLDFN 1
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* Data Structure Definitions */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
typedef struct lkdfig /* linked figure */
|
||||
{
|
||||
struct lkdfig *NEXT ; /* next figure */
|
||||
char *NAME ; /* figure's name */
|
||||
struct lkdins *LKDINS; /* list of instances */
|
||||
struct simsig *SIMSIG; /* list of simple signals */
|
||||
struct bussig *BUSSIG; /* list of bused signals */
|
||||
unsigned int VALSIZ; /* # of bytes needed for values */
|
||||
}
|
||||
lkdfig_list;
|
||||
|
||||
typedef struct lkdins /* linked instance */
|
||||
{
|
||||
struct lkdins *NEXT ; /* next instance */
|
||||
char *INSNAME; /* instance's name */
|
||||
struct befig *BEFIG ; /* instance model */
|
||||
struct wrssig *WRSSIG ; /* written output ports */
|
||||
struct wriaux *WRIAUX ; /* written internal signals */
|
||||
struct wribux *WRIBUX ; /* written internal bused sig. */
|
||||
struct wrbsig *WRBSIG ; /* written bused ports */
|
||||
struct wrireg *WRIREG ; /* written registers */
|
||||
struct wrimsg *WRIMSG ; /* written asserts */
|
||||
struct redlst *REDLST ; /* read values */
|
||||
struct circuit *CIRCUI ; /* Circuit pointer used for BDDs*/
|
||||
unsigned char LEVEL ; /* level */
|
||||
char EVAL ; /* Evaluation's flag */
|
||||
char FLAG ; /* model type */
|
||||
}
|
||||
lkdins_list;
|
||||
|
||||
typedef struct simsig /* simple signal */
|
||||
{
|
||||
struct simsig *NEXT ; /* next simple signal */
|
||||
struct chain *NAMECHAIN; /* signal's name */
|
||||
struct ptype *DEPEND ; /* dependency list */
|
||||
unsigned char *CURVAL ; /* signal's current value */
|
||||
unsigned char PRJVAL ; /* signal's projected value */
|
||||
}
|
||||
simsig_list;
|
||||
|
||||
typedef struct bussig /* bused signal */
|
||||
{
|
||||
struct bussig *NEXT ; /* next simple signal */
|
||||
struct chain *NAMECHAIN; /* signal's name */
|
||||
struct ptype *DEPEND ; /* dependency list */
|
||||
unsigned char *CURVAL ; /* signal's current value */
|
||||
struct prjbvl *PRJBVL ; /* list of projected bi-values */
|
||||
char TYPE ; /* signal's type */
|
||||
char ERRFLG ; /* error flag */
|
||||
}
|
||||
bussig_list;
|
||||
|
||||
typedef struct wrbsig /* written bused signal */
|
||||
{
|
||||
struct wrbsig *NEXT ; /* next signal */
|
||||
struct lkdins *LKDINS ; /* instance */
|
||||
struct bebus *BEBUS ; /* formal bused signal (model) */
|
||||
struct bussig *BUSSIG ; /* actual bused signal */
|
||||
struct prjbvl *PRJBVL ; /* list of projected bi-values */
|
||||
unsigned char LEVEL ; /* level */
|
||||
char EVAL ; /* evaluation flag */
|
||||
}
|
||||
wrbsig_list;
|
||||
|
||||
typedef struct wriaux /* written auxiliary signal */
|
||||
{
|
||||
struct wriaux *NEXT ; /* next auxiliary signal */
|
||||
struct ptype *DEPEND ; /* dependency list */
|
||||
struct lkdins *LKDINS ; /* instance */
|
||||
struct beaux *BEAUX ; /* formal internal sig. (model) */
|
||||
unsigned char *CURVAL ; /* aux. signal current value */
|
||||
unsigned char PRJVAL ; /* aux. signal projected value */
|
||||
unsigned char LEVEL ; /* level */
|
||||
char EVAL ; /* evaluation flag */
|
||||
char FLAG ; /* signal type (delayed) */
|
||||
}
|
||||
wriaux_list;
|
||||
|
||||
typedef struct wrimsg /* assert */
|
||||
{
|
||||
struct wrimsg *NEXT ; /* next assert */
|
||||
struct bemsg *BEMSG ; /* formal assert (model) */
|
||||
struct lkdins *LKDINS ; /* instance */
|
||||
unsigned char LEVEL ; /* level */
|
||||
char EVAL ; /* evaluation flag */
|
||||
char ERRFLG ; /* assert violation flag */
|
||||
}
|
||||
wrimsg_list;
|
||||
|
||||
typedef struct wrireg /* written register */
|
||||
{
|
||||
struct wrireg *NEXT ; /* next register */
|
||||
struct ptype *DEPEND ; /* dependency list */
|
||||
struct lkdins *LKDINS ; /* instance */
|
||||
struct bereg *BEREG ; /* formal register (model) */
|
||||
unsigned char *CURVAL ; /* register's current value */
|
||||
struct prjrvl *PRJRVL ; /* list of projected bi-values */
|
||||
char EVAL ; /* evaluation flag */
|
||||
char ERRFLG ; /* error flag */
|
||||
}
|
||||
wrireg_list;
|
||||
|
||||
typedef struct wribux /* written internal bused sig. */
|
||||
{
|
||||
struct wribux *NEXT ; /* next signal */
|
||||
struct ptype *DEPEND ; /* dependency list */
|
||||
struct lkdins *LKDINS ; /* instance */
|
||||
struct bebux *BEBUX ; /* formal bused signal (model) */
|
||||
unsigned char *CURVAL ; /* register's current value */
|
||||
struct prjbvl *PRJBVL ; /* list of projected bi-values */
|
||||
unsigned char LEVEL ; /* level */
|
||||
char EVAL ; /* evaluation flag */
|
||||
char ERRFLG ; /* error flag */
|
||||
}
|
||||
wribux_list;
|
||||
|
||||
typedef struct wrssig /* written simple signal */
|
||||
{
|
||||
struct wrssig *NEXT ; /* next object */
|
||||
struct beout *BEOUT ; /* formal output port (model) */
|
||||
struct lkdins *LKDINS ; /* instance */
|
||||
struct simsig *SIMSIG ; /* actual signal */
|
||||
unsigned char LEVEL ; /* level */
|
||||
char EVAL ; /* evaluation flag */
|
||||
}
|
||||
wrssig_list;
|
||||
|
||||
typedef struct redlst /* list of read values */
|
||||
{
|
||||
struct redlst *NEXT; /* next value */
|
||||
unsigned char *VALU; /* pointer on the value */
|
||||
}
|
||||
redlst_list;
|
||||
|
||||
typedef struct prjbvl /* projected bi-value */
|
||||
{
|
||||
struct prjbvl *NEXT ; /* next bi-value (local) */
|
||||
struct prjbvl *GLNEXT; /* next bi-value (global) */
|
||||
unsigned char CNDVAL; /* driver's condition value */
|
||||
unsigned char DRVVAL; /* drove value */
|
||||
}
|
||||
prjbvl_list;
|
||||
|
||||
typedef struct prjrvl /* projected bi-value */
|
||||
{
|
||||
struct prjrvl *NEXT ; /* next bi-value */
|
||||
unsigned char CNDVAL; /* driver's condition value */
|
||||
unsigned char DRVVAL; /* drove value */
|
||||
}
|
||||
prjrvl_list;
|
||||
|
||||
typedef struct magex /* general expression */
|
||||
{
|
||||
struct chain *OPERAND; /* operands or NULL for terms */
|
||||
unsigned int TERM ; /* operator or terminal's index */
|
||||
unsigned short TYPE ; /* expression's type index */
|
||||
}
|
||||
magex_list;
|
||||
|
||||
typedef struct lkdmdl /* list od C models */
|
||||
{
|
||||
struct lkdmdl *NEXT ; /* next model */
|
||||
char *NAME ; /* model's name */
|
||||
void (*FONC) (); /* pointer of the C function */
|
||||
}
|
||||
lkdmdl_list;
|
||||
|
||||
typedef struct lkdspy /* spied signals */
|
||||
{
|
||||
struct lkdspy *NEXT ; /* next spy */
|
||||
unsigned int IOLNBR ; /* spy's iol number (ident) */
|
||||
struct paiol *PAIOL ; /* spied paiol */
|
||||
}
|
||||
lkdspy_list;
|
|
@ -0,0 +1,974 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : vh_simulad.c */
|
||||
/* date : Dec 13 1999 */
|
||||
/* version : v3.02 */
|
||||
/* author : Huu Nghia VUONG, Pirouz BAZARGAN SABET */
|
||||
/* description : VHDL simulation tool */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#ident "@(#) SIMULAD : SIMULAtion tool with Delays V3.02"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "mut.h"
|
||||
#include "mlo.h"
|
||||
#include "mlu.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "bhl.h"
|
||||
#include "bvl.h"
|
||||
#include "pat.h"
|
||||
#include "ppt.h"
|
||||
#include "sch.h"
|
||||
#include "vh_ltype.h"
|
||||
#include "vh_globals.h"
|
||||
#include "vh_util.h"
|
||||
#include "vh_lspec.h"
|
||||
#include "vh_xspec.h"
|
||||
#include "vh_xcomm.h"
|
||||
#include "vh_simulad.h"
|
||||
#include "beh_delay.h"
|
||||
|
||||
extern char MVL_ERRFLG;
|
||||
|
||||
static char *VH_TUNIT_TABLE [] = { "vu", "fs", "ps", "ns", "us", "ms" };
|
||||
|
||||
|
||||
main (argc, argv)
|
||||
|
||||
int argc;
|
||||
char **argv;
|
||||
|
||||
{
|
||||
int i ;
|
||||
int j ;
|
||||
int patindx ;
|
||||
char error_flag ;
|
||||
int nbr_errlft ; /* how many errors left */
|
||||
/* before aborting */
|
||||
unsigned int max_delta = VHX_DLTDFN; /* max # of delta cyc. */
|
||||
|
||||
char usage_flg = 0 ; /* print usage */
|
||||
char help_flg = 0 ; /* display help */
|
||||
char init_flg = 0 ; /* description's init. */
|
||||
char core_flg = 0 ; /* core file at error */
|
||||
char sdebug_flg = 0 ; /* debug structural */
|
||||
char bdebug_flg = 0 ; /* debug behavioural */
|
||||
char pdebug_flg = 0 ; /* debug pattern */
|
||||
char ldebug_flg = 0 ; /* debug linker */
|
||||
char cdebug_flg = 0 ; /* dbeug cycle by cycle */
|
||||
char ddebug_flg = 0 ; /* debug delta by delta */
|
||||
char behav_flg = 0 ; /* behav. description */
|
||||
char nosim_flg = 0 ; /* no simulation */
|
||||
char nores_flg = 0 ; /* no result file */
|
||||
char makbdd_flg = 0 ; /* trace bdd making */
|
||||
char bdd_flg = 0 ; /* use bdd or gex */
|
||||
char xmess_flg = 0 ; /* no execution message */
|
||||
char randly_flg = 0 ; /* random delays */
|
||||
char fixdly_flg = 0 ; /* fixed delays */
|
||||
char defdly_flg = 0 ; /* default delays */
|
||||
char bckdly_flg = 0 ; /* backanotated delays */
|
||||
char trans_flg = 0 ; /* transport delays */
|
||||
char inert_flg = 1 ; /* inertial delays */
|
||||
char bufreg_flg = 0 ; /* bufreg delays */
|
||||
char stat_flg = 0 ; /* stat */
|
||||
char sav_end ; /* saved end flag */
|
||||
int max_err = 10 ; /* # of simul. errors */
|
||||
unsigned int max_pat = 0 ; /* # of patterns */
|
||||
unsigned int labelsiz = 32 ; /* longest patt. label */
|
||||
char *arg_flg = NULL ; /* recongnized arg. flg */
|
||||
unsigned int last_opt = 0 ; /* last option's index */
|
||||
unsigned int frst_fil = 0 ; /* first file's index */
|
||||
unsigned int init_val = 0 ; /* init. constant */
|
||||
|
||||
unsigned int comp_mode = 0 ; /* beh compiler mode */
|
||||
struct lofig *ptlofig ;
|
||||
struct befig *ptbefig = NULL ;
|
||||
struct befig *ptbef ;
|
||||
struct chain *ptchain ;
|
||||
struct papat *pt_papat ;
|
||||
struct papat *lst_papat ;
|
||||
struct paseq *pt_paseq ;
|
||||
struct pains *pt_pains = NULL ; /* inspected instances */
|
||||
struct lkdspy *pt_lkdspy = NULL ; /* inspected signals */
|
||||
struct pains *tmp_pains = NULL ;
|
||||
|
||||
struct shdul *pt_shdul ; /* scheduler */
|
||||
struct shtra *pt_shtra ; /* transactions */
|
||||
unsigned int delay_max = 0 ;
|
||||
unsigned int next_date = 0 ;
|
||||
unsigned int cur_date = 0 ;
|
||||
unsigned int ref_date = 0 ;
|
||||
unsigned int num_cycle = 0 ;
|
||||
int sch_empty = 0 ;
|
||||
|
||||
char *str ;
|
||||
char filename [200];
|
||||
char buffer [200];
|
||||
FILE *filepnt ;
|
||||
struct beden **hshtab ;
|
||||
struct beden **stat_dic ;
|
||||
struct beden **delay_dic ;
|
||||
unsigned char delay_mode = 0x00 ;
|
||||
struct paiol *pt_paiol ;
|
||||
unsigned int iolnbr = 0 ;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* analyse the command line, set option flags and find the */
|
||||
/* first file in the argument list */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
mbkenv ();
|
||||
|
||||
arg_flg = (char *) vhu_alloc (argc * sizeof (char), VHU_NOALIGN);
|
||||
|
||||
arg_flg [0] = 1;
|
||||
for (i=1 ; i<argc ; i++)
|
||||
arg_flg [i] = 0;
|
||||
|
||||
for (i=1 ; i<argc ; i++)
|
||||
{
|
||||
if (arg_flg [i] == 0)
|
||||
{
|
||||
if (!strcmp (argv [i], "-h"))
|
||||
{
|
||||
help_flg = 1;
|
||||
arg_flg [i] = 1;
|
||||
}
|
||||
|
||||
if ((!strcmp (argv [i], "-randomdelay"))
|
||||
|| (!strcmp (argv [i], "-rd")))
|
||||
{
|
||||
randly_flg = 1;
|
||||
delay_mode |= BEH_DELAY_RANDOM;
|
||||
delay_max = 128;
|
||||
arg_flg [i ] = 1;
|
||||
}
|
||||
|
||||
if ((!strcmp (argv [i], "-zerodelay"))
|
||||
|| (!strcmp (argv [i], "-zd")))
|
||||
{
|
||||
fixdly_flg = 1;
|
||||
delay_mode |= BEH_DELAY_FIXED;
|
||||
delay_max = 0;
|
||||
arg_flg [i ] = 1;
|
||||
}
|
||||
|
||||
if ((!strcmp (argv [i], "-fixeddelay"))
|
||||
|| (!strcmp (argv [i], "-fd")))
|
||||
{
|
||||
fixdly_flg = 1;
|
||||
delay_mode |= BEH_DELAY_FIXED;
|
||||
sscanf (argv [i+1], "%u", &delay_max);
|
||||
arg_flg [i ] = 1;
|
||||
arg_flg [i+1] = 1;
|
||||
}
|
||||
|
||||
if ((!strcmp (argv [i], "-backdelay"))
|
||||
|| (!strcmp (argv [i], "-bd")))
|
||||
{
|
||||
bckdly_flg = i + 2;
|
||||
delay_mode |= BEH_DELAY_BACKANOTATED;
|
||||
if (!strcmp (argv [i+1], "max"))
|
||||
{
|
||||
delay_mode |= BEH_DELAY_MAX;
|
||||
}
|
||||
else if (!strcmp (argv [i+1], "min"))
|
||||
{
|
||||
delay_mode |= BEH_DELAY_MIN;
|
||||
}
|
||||
else if (!strcmp (argv [i+1], "typ"))
|
||||
{
|
||||
delay_mode |= BEH_DELAY_TYP;
|
||||
}
|
||||
delay_max = 128;
|
||||
arg_flg [i ] = 1;
|
||||
arg_flg [i+1] = 1;
|
||||
arg_flg [i+2] = 1;
|
||||
}
|
||||
|
||||
if ((!strcmp (argv [i], "-defaultdelay"))
|
||||
|| (!strcmp (argv [i], "-dd")))
|
||||
{
|
||||
defdly_flg = 1;
|
||||
delay_mode |= BEH_DELAY_DEFAULT;
|
||||
arg_flg [i] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-transport"))
|
||||
{
|
||||
trans_flg = 1;
|
||||
inert_flg = 0;
|
||||
arg_flg [i] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-inertial"))
|
||||
{
|
||||
inert_flg = 1;
|
||||
arg_flg [i] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-bufreg"))
|
||||
{
|
||||
bufreg_flg = 1;
|
||||
arg_flg [i] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-noxmessage"))
|
||||
{
|
||||
xmess_flg = 1;
|
||||
arg_flg [i] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-p"))
|
||||
{
|
||||
sscanf (argv [i+1], "%u", &max_pat);
|
||||
arg_flg [i ] = 1;
|
||||
arg_flg [i+1] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-l"))
|
||||
{
|
||||
sscanf (argv [i+1], "%u", &labelsiz);
|
||||
arg_flg [i ] = 1;
|
||||
arg_flg [i+1] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-t"))
|
||||
{
|
||||
makbdd_flg = 1;
|
||||
arg_flg [i] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-stat"))
|
||||
{
|
||||
stat_flg = i + 2;
|
||||
sscanf (argv [i+1], "%u", &ref_date);
|
||||
arg_flg [i ] = 1;
|
||||
arg_flg [i+1] = 1;
|
||||
arg_flg [i+2] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-i"))
|
||||
{
|
||||
init_flg = i + 1;
|
||||
arg_flg [i ] = 1;
|
||||
arg_flg [i+1] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-core"))
|
||||
{
|
||||
core_flg = i + 1;
|
||||
arg_flg [i ] = 1;
|
||||
arg_flg [i+1] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-inspect"))
|
||||
{
|
||||
str = namealloc (argv [i+1]);
|
||||
pt_pains = pat_addpains (pt_pains, str, str);
|
||||
arg_flg [i ] = 1;
|
||||
arg_flg [i+1] = 1;
|
||||
}
|
||||
|
||||
/* The spy option has been supressed (09 Sep 1999). */
|
||||
/* Spied signals are now specified in the pattern file. */
|
||||
|
||||
/*---------------
|
||||
if (!strcmp (argv [i], "-spy"))
|
||||
{
|
||||
str = namealloc (argv [i+1]);
|
||||
pt_lkdspy = vhl_addlkdspy (pt_lkdspy, str);
|
||||
arg_flg [i ] = 1;
|
||||
arg_flg [i+1] = 1;
|
||||
}
|
||||
----------------*/
|
||||
|
||||
if (!strcmp (argv [i], "-nores"))
|
||||
{
|
||||
nores_flg = 1;
|
||||
arg_flg [i] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-c"))
|
||||
{
|
||||
nosim_flg = 1;
|
||||
arg_flg [i] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-bdd"))
|
||||
{
|
||||
bdd_flg = 1;
|
||||
arg_flg [i] = 1;
|
||||
}
|
||||
|
||||
if (!strcmp (argv [i], "-b"))
|
||||
{
|
||||
behav_flg = 1;
|
||||
arg_flg [i] = 1;
|
||||
}
|
||||
|
||||
if (!strncmp (argv [i], "-dbg", 4))
|
||||
{
|
||||
arg_flg [i] = 1;
|
||||
for (j=4 ; argv [i][j] != '\0' ; j++)
|
||||
{
|
||||
switch (argv [i][j])
|
||||
{
|
||||
case 's':
|
||||
sdebug_flg = 1; break;
|
||||
case 'b':
|
||||
bdebug_flg = 1; break;
|
||||
case 'l':
|
||||
ldebug_flg = 1; break;
|
||||
case 'p':
|
||||
pdebug_flg = 1; break;
|
||||
case 'c':
|
||||
cdebug_flg = 1; break;
|
||||
case 'd':
|
||||
ddebug_flg = 1; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0 ; i<argc ; i++)
|
||||
{
|
||||
if (arg_flg [i] == 1)
|
||||
last_opt = i;
|
||||
}
|
||||
|
||||
for (frst_fil=0 ; frst_fil < argc ; frst_fil++)
|
||||
{
|
||||
if (arg_flg [frst_fil] == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* cases of error in the command line: */
|
||||
/* - no argument */
|
||||
/* - argument unrecognized as an option */
|
||||
/* - number of files do not match: */
|
||||
/* - simulation with result => 3 files needed */
|
||||
/* - simulation without result => 2 files needed */
|
||||
/* - no simulation => 1 file needed */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (help_flg == 1)
|
||||
{
|
||||
vhu_message (0, NULL, 0);
|
||||
system ("man asimut");
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if ((argc == 1) || (last_opt != (frst_fil - 1)))
|
||||
usage_flg = 1;
|
||||
|
||||
if (((nosim_flg == 0) && (nores_flg == 0) && (argc != (frst_fil + 3))) ||
|
||||
((nosim_flg == 0) && (nores_flg == 1) && (argc != (frst_fil + 2))) ||
|
||||
((nosim_flg == 1) && (argc != (frst_fil + 1))))
|
||||
usage_flg = 1;
|
||||
|
||||
if ((inert_flg == 1) && (trans_flg == 1))
|
||||
usage_flg = 1;
|
||||
|
||||
if (((bckdly_flg != 0) && (fixdly_flg != 0)) ||
|
||||
((randly_flg != 0) && (fixdly_flg != 0)) ||
|
||||
((bckdly_flg != 0) && (randly_flg != 0)))
|
||||
usage_flg = 1;
|
||||
|
||||
if ((bckdly_flg != 0) && ((delay_mode & BEH_DELAY_MAX) != BEH_DELAY_MAX)
|
||||
&& ((delay_mode & BEH_DELAY_MIN) != BEH_DELAY_MIN)
|
||||
&& ((delay_mode & BEH_DELAY_TYP) != BEH_DELAY_TYP))
|
||||
usage_flg = 1;
|
||||
|
||||
if (usage_flg == 1)
|
||||
{
|
||||
vhu_message (100, NULL, 0);
|
||||
vhu_message (101, NULL, 0);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
alliancebanner ("ASimuT", vhu_avers (), "A SIMUlation Tool",
|
||||
"1991...1999", ALLIANCE_VERSION);
|
||||
|
||||
vhu_message (21, NULL, 0);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* initialize : */
|
||||
/* - get MBK environment variables */
|
||||
/* - initialize C models' pointer */
|
||||
/* - create a scheduler */
|
||||
/* - initialize BDD hash tables */
|
||||
/* - initialize the linker's hash table */
|
||||
/* - set the fast mode on MBK functions */
|
||||
/* - set the behavioural compiler's mode */
|
||||
/* - set BEH_TIMEUNIT to BEH_TU__PS */
|
||||
/* - set PAT_TIMEUNIT to PAT_TU__PS */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhu_message (2, NULL, 0);
|
||||
|
||||
vhi_models ();
|
||||
initializeBdd (0);
|
||||
hshtab = beh_initab ();
|
||||
stat_dic = beh_initab ();
|
||||
pt_shdul = sch_CreateScheduler (NULL, NULL);
|
||||
VHX_SHDUL = pt_shdul;
|
||||
|
||||
BEH_TIMEUNIT = BEH_TU__PS;
|
||||
PAT_TIMEUNIT = PAT_TU__PS;
|
||||
|
||||
FAST_MODE = 'Y';
|
||||
comp_mode = BVL_TRACE | BVL_KEEPAUX;
|
||||
|
||||
if (trans_flg == 1)
|
||||
{
|
||||
VHX_SCH_TRA_MODE = SCH_TRA_DELAFTER ;
|
||||
}
|
||||
|
||||
if (inert_flg == 1)
|
||||
{
|
||||
VHX_SCH_TRA_MODE = SCH_TRA_DELBEFORE | SCH_TRA_DELAFTER ;
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the maximum number of simulation errors from the */
|
||||
/* environment variable VH_MAXERR */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
str = mbkgetenv ("VH_MAXERR");
|
||||
if (str != NULL)
|
||||
{
|
||||
if (sscanf (str, "%u", &max_err) == 0)
|
||||
max_err = 10;
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* searching the root file */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhu_message (5, argv [frst_fil], 0);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* if there is no structural level call directly the */
|
||||
/* behaviour compiler */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (behav_flg == 1)
|
||||
{
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* run the behavioural compiler on the current file. Call */
|
||||
/* the debugger is necessary */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (vhl_iscmodel (argv [frst_fil]) == NULL)
|
||||
comp_mode = BVL_TRACE | BVL_KEEPAUX ;
|
||||
else
|
||||
comp_mode = BVL_TRACE | BVL_KEEPAUX | BVL_CHECKEMPTY;
|
||||
|
||||
ptbefig = vhdlloadbefig (ptbefig, argv [frst_fil], comp_mode);
|
||||
error_flag = ptbefig->ERRFLG;
|
||||
|
||||
if (bdebug_flg == 1)
|
||||
dast_dbg (ptbefig, "befig");
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* if the architecture of the compiled description is VHDL */
|
||||
/* and if there is no error in the description : */
|
||||
/* */
|
||||
/* - identify dependencies in the description */
|
||||
/* - transform boolean expression into BDDs or GEXs */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if ((ptbefig->ERRFLG == 0) && (ptbefig->FLAG & BEH_ARC_VHDL))
|
||||
{
|
||||
delay_dic = beh_initab ();
|
||||
|
||||
if (bckdly_flg != 0)
|
||||
{
|
||||
error_flag += beh_backdelay (delay_dic, argv [bckdly_flg], delay_mode);
|
||||
}
|
||||
|
||||
if ((bckdly_flg != 0) || (fixdly_flg != 0) || (randly_flg != 0))
|
||||
{
|
||||
beh_setdelay (ptbefig, delay_max, delay_mode, delay_dic);
|
||||
}
|
||||
|
||||
if (bufreg_flg != 0)
|
||||
{
|
||||
beh_chkregdly (ptbefig, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
beh_chkregdly (ptbefig, 1);
|
||||
}
|
||||
|
||||
beh_fretab (delay_dic);
|
||||
|
||||
beh_depend (ptbefig);
|
||||
|
||||
if (bdd_flg == 1)
|
||||
{
|
||||
vhu_message (15, "BDD", 0);
|
||||
beh_makbdd (ptbefig);
|
||||
}
|
||||
else
|
||||
{
|
||||
vhu_message (15, "GEX", 0);
|
||||
beh_makgex (ptbefig);
|
||||
}
|
||||
|
||||
beh_freabl (ptbefig);
|
||||
error_flag += ptbefig->ERRFLG;
|
||||
}
|
||||
|
||||
ptlofig = vhl_makgst (ptbefig);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* run the structural compiler on the root file and call the */
|
||||
/* debugger if it has been asked. Flatten the root description */
|
||||
/* and call the structural compiler as many times as necessary */
|
||||
/* to reach leaf cells (behavioural description) */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhu_message (4, argv [frst_fil], 0);
|
||||
|
||||
VHS_LOFPNT = getlofig (argv [frst_fil], 'A');
|
||||
error_flag = MVL_ERRFLG;
|
||||
|
||||
if (sdebug_flg == 1)
|
||||
dast_dbg (HEAD_LOFIG, "lofig");
|
||||
|
||||
if (error_flag != 0)
|
||||
{
|
||||
error_flag = vhu_error (200, NULL, NULL);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
vhu_message (18, NULL, 0);
|
||||
lofigchain (VHS_LOFPNT);
|
||||
rflattenlofig (VHS_LOFPNT, YES, YES);
|
||||
|
||||
if (sdebug_flg == 1)
|
||||
dast_dbg (HEAD_LOFIG, "lofig");
|
||||
|
||||
ptchain = VHS_LOFPNT->MODELCHAIN;
|
||||
while (ptchain != NULL)
|
||||
{
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* for each leaf cell of the description search the */
|
||||
/* behavioural file */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhu_message (5, ptchain->DATA, 0);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* run the behavioural compiler on the current file */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
ptbef = ptbefig;
|
||||
|
||||
if (vhl_iscmodel ((char *)ptchain->DATA) == NULL)
|
||||
comp_mode = BVL_TRACE | BVL_KEEPAUX ;
|
||||
else
|
||||
comp_mode = BVL_TRACE | BVL_KEEPAUX | BVL_CHECKEMPTY;
|
||||
|
||||
ptbefig = vhdlloadbefig (ptbefig, ptchain->DATA, comp_mode);
|
||||
ptbefig->NEXT = ptbef;
|
||||
error_flag += ptbefig->ERRFLG;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* if the architecture of the compiled description is VHDL */
|
||||
/* and if there is no error in the description ; */
|
||||
/* */
|
||||
/* - identify dependencies in the description */
|
||||
/* - transform boolean expression into BDDs or GEXs */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if ((error_flag == 0) && (ptbefig->FLAG & BEH_ARC_VHDL))
|
||||
{
|
||||
delay_dic = beh_initab ();
|
||||
|
||||
if (bckdly_flg != 0)
|
||||
{
|
||||
error_flag += beh_backdelay (delay_dic, ptbefig->NAME, delay_mode);
|
||||
}
|
||||
|
||||
if ((bckdly_flg != 0) || (fixdly_flg) || (randly_flg))
|
||||
{
|
||||
beh_setdelay (ptbefig, delay_max, delay_mode, delay_dic);
|
||||
}
|
||||
|
||||
if (bufreg_flg != 0)
|
||||
{
|
||||
beh_chkregdly (ptbefig, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
beh_chkregdly (ptbefig, 1);
|
||||
}
|
||||
|
||||
beh_fretab (delay_dic);
|
||||
|
||||
beh_depend (ptbefig);
|
||||
|
||||
if (bdd_flg == 1)
|
||||
{
|
||||
vhu_message (15, "BDD", 0);
|
||||
beh_makbdd (ptbefig);
|
||||
}
|
||||
else
|
||||
{
|
||||
vhu_message (15, "GEX", 0);
|
||||
beh_makgex (ptbefig);
|
||||
}
|
||||
|
||||
beh_freabl (ptbefig);
|
||||
error_flag += ptbefig->ERRFLG;
|
||||
}
|
||||
ptchain = ptchain->NEXT;
|
||||
}
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* call the debugger if necessary */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (bdebug_flg == 1)
|
||||
dast_dbg (ptbefig, "befig");
|
||||
|
||||
if (error_flag != 0)
|
||||
{
|
||||
error_flag = vhu_error (200, NULL, NULL);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (nosim_flg == 1)
|
||||
exit (0);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* running the pattern description compiler on the current */
|
||||
/* file */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhu_message (6, argv [frst_fil + 1], 0);
|
||||
|
||||
pt_paseq = pat_lodpaseq (argv [frst_fil+1], NULL, max_pat, 0);
|
||||
|
||||
if ((pt_paseq == NULL) || (pt_paseq->ERRFLG != 0))
|
||||
{
|
||||
error_flag = vhu_error (200, NULL, NULL);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* add the spied signals specified in the pattern file to */
|
||||
/* the list of spy : pt_lkdspy. */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
for (pt_paiol = pt_paseq->PAIOL, iolnbr = 0; pt_paiol !=NULL; pt_paiol = pt_paiol->NEXT,iolnbr++)
|
||||
{
|
||||
if (pt_paiol->FLAG == PAT_IOL__SPY)
|
||||
{
|
||||
pt_lkdspy = vhl_addlkdspy (pt_lkdspy, pt_paiol, iolnbr);
|
||||
}
|
||||
}
|
||||
|
||||
vhx_commentspytable(pt_paseq,pt_lkdspy);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* add the list of inspected instances passed as argument to */
|
||||
/* the list of inspected instances found in the pattern file */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (pt_pains != NULL)
|
||||
{
|
||||
tmp_pains = pt_pains;
|
||||
while (tmp_pains->NEXT != NULL)
|
||||
tmp_pains = tmp_pains->NEXT;
|
||||
|
||||
tmp_pains->NEXT = pt_paseq->PAINS;
|
||||
pt_paseq->PAINS = pt_pains;
|
||||
}
|
||||
|
||||
if (pdebug_flg == 1)
|
||||
dast_dbg (pt_paseq, "paseq");
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* link previous structures to create the simulator's data */
|
||||
/* base structures */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhu_message (16, NULL, 0);
|
||||
|
||||
if (behav_flg == 0)
|
||||
vhl_resord (hshtab, HEAD_LOFIG, ptbefig);
|
||||
|
||||
if (sdebug_flg == 1)
|
||||
dast_dbg (HEAD_LOFIG, "lofig");
|
||||
|
||||
error_flag = vhl_restor (hshtab, HEAD_LOFIG, ptbefig);
|
||||
|
||||
if (sdebug_flg == 1)
|
||||
dast_dbg (HEAD_LOFIG, "lofig");
|
||||
|
||||
if (error_flag != 0)
|
||||
{
|
||||
error_flag = vhu_error (200, NULL, NULL);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
vhu_message (9, NULL, 0);
|
||||
|
||||
error_flag = vhl_linker (hshtab, pt_paseq);
|
||||
|
||||
if (error_flag != 0)
|
||||
{
|
||||
error_flag = vhu_error (200, NULL, NULL);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* initialize the circuit with a .sav file or a constant. */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (init_flg != 0)
|
||||
{
|
||||
if ((sscanf (argv [init_flg], "%u", &init_val) == 1) && (init_val <= 1))
|
||||
vhx_initval (VHL_HEDLKF, init_val + '0');
|
||||
else
|
||||
{
|
||||
if ((filepnt = mbkfopen (argv [init_flg], "sav", READ_TEXT)) == NULL)
|
||||
vhu_error (116, argv [init_flg], NULL);
|
||||
else
|
||||
{
|
||||
error_flag = vhx_initfig (VHL_HEDLKF, filepnt);
|
||||
fclose (filepnt);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
vhx_initval (VHL_HEDLKF, 'u');
|
||||
|
||||
if (ldebug_flg == 1)
|
||||
dast_dbg (VHL_HEDLKF, "lkdfig");
|
||||
|
||||
if (pdebug_flg == 1)
|
||||
dast_dbg (pt_paseq, "paseq");
|
||||
|
||||
if (error_flag != 0)
|
||||
{
|
||||
error_flag = vhu_error (200, NULL, NULL);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* execute the current figure */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
vhu_message (11, NULL, 0);
|
||||
|
||||
vhx_execall (VHL_HEDLKF);
|
||||
patindx = 0;
|
||||
|
||||
nbr_errlft = max_err;
|
||||
|
||||
while (1)
|
||||
{
|
||||
pt_papat = pt_paseq->CURPAT;
|
||||
|
||||
while ((pt_papat != NULL) && (pt_papat != pt_paseq->NXTPAT) &&
|
||||
(nbr_errlft > 0 ))
|
||||
{
|
||||
max_delta = VHX_DLTDFN;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read a new pattern */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if ((sch_empty == 0) || (pt_papat->TIME <= next_date))
|
||||
{
|
||||
if ((sch_empty != 0) && (cdebug_flg == 1))
|
||||
{
|
||||
vhu_warning (5, NULL, NULL);
|
||||
}
|
||||
|
||||
cur_date = pt_papat->TIME;
|
||||
sch_SetCurrentTime (pt_shdul, cur_date);
|
||||
|
||||
if (xmess_flg == 0)
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* Are we in virtual time unit or real time unit ? */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (pt_paseq->TIME_UNIT == PAT_TU__VU)
|
||||
{
|
||||
vhu_message (10, NULL, patindx);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf (buffer,"%u %s", cur_date, VH_TUNIT_TABLE [PAT_TIMEUNIT]);
|
||||
vhu_message (22, buffer, patindx);
|
||||
}
|
||||
}
|
||||
|
||||
if (pt_papat->ACTFLAG == 'I')
|
||||
{
|
||||
vhx_inireg (hshtab, pt_papat->PAINI);
|
||||
}
|
||||
|
||||
vhx_redpat (pt_paseq, pt_papat);
|
||||
}
|
||||
|
||||
if ((sch_empty != 0) && (next_date <= pt_papat->TIME))
|
||||
{
|
||||
cur_date = next_date;
|
||||
sch_SetCurrentTime (pt_shdul, cur_date);
|
||||
|
||||
pt_shtra = sch_GetCurrentTransactions (pt_shdul);
|
||||
vhx_redtra (pt_shtra);
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
vhx_supdate (stat_dic, cur_date);
|
||||
vhx_execute (pt_shdul, bdd_flg );
|
||||
|
||||
sch_empty = sch_GetNextTime (pt_shdul, &next_date);
|
||||
|
||||
if ((sch_empty != 0) && (next_date == cur_date))
|
||||
{
|
||||
pt_shtra = sch_GetCurrentTransactions (pt_shdul);
|
||||
vhx_redtra (pt_shtra);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (max_delta <= 0)
|
||||
break;
|
||||
|
||||
|
||||
if (pt_papat->TIME == cur_date)
|
||||
{
|
||||
if (stat_flg != 0)
|
||||
{
|
||||
if (cur_date == 0)
|
||||
{
|
||||
num_cycle++;
|
||||
vhx_vectorinit ( VHL_HEDLKF );
|
||||
}
|
||||
|
||||
else if ((cur_date % ref_date) == 0)
|
||||
{
|
||||
num_cycle++;
|
||||
vhx_vectorstat ( VHL_HEDLKF );
|
||||
}
|
||||
}
|
||||
|
||||
nbr_errlft -= vhx_wrtpat (pt_paseq, pt_papat);
|
||||
lst_papat = pt_papat;
|
||||
pt_papat = pt_papat->NEXT;
|
||||
patindx ++;
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* When pattern time < simulation time, */
|
||||
/* insert one pattern if a spy event occurs. */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
else
|
||||
{
|
||||
lst_papat = vhx_insertspypat (pt_paseq, lst_papat, pt_lkdspy, cur_date, labelsiz);
|
||||
}
|
||||
/* ###------------------------------------------------------### */
|
||||
/* If a fatal error has been occured during the simulation */
|
||||
/* (Assert Violation, Bus conflict), set the end flag of the */
|
||||
/* pattern sequence to avoid loading new patterns and break the */
|
||||
/* simulation cycle */
|
||||
/* */
|
||||
/* Otherwies, continue the simulation cycle */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (vhx_chkerr (cur_date) == 1)
|
||||
{
|
||||
pt_paseq->ENDFLG = 'Y';
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* After all the patterns of a set have been processed ... */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (pdebug_flg == 1)
|
||||
dast_dbg (pt_paseq, "paseq");
|
||||
|
||||
if (nores_flg == 0)
|
||||
pat_savpaseq (argv [frst_fil + 2], pt_paseq, labelsiz);
|
||||
|
||||
if (max_delta <= 0)
|
||||
break;
|
||||
|
||||
if ((pt_paseq->ENDFLG != 'Y') && (pt_paseq->ERRFLG == 0))
|
||||
{
|
||||
pt_paseq = pat_lodpaseq (argv [frst_fil+1], pt_paseq, max_pat, 0);
|
||||
if (pdebug_flg == 1)
|
||||
dast_dbg (pt_paseq, "paseq");
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (max_delta <= 0)
|
||||
error_flag = vhu_error (105, NULL, NULL);
|
||||
|
||||
if (nbr_errlft < 0)
|
||||
error_flag = vhu_error (106, NULL, NULL);
|
||||
else
|
||||
{
|
||||
if (stat_flg != 0)
|
||||
{
|
||||
st_wrtsta (stat_dic, VHL_HEDLKF, pt_paseq, num_cycle, argv [stat_flg]);
|
||||
st_wrtstadly (stat_dic, VHL_HEDLKF, pt_paseq, cur_date, ref_date, argv [stat_flg]);
|
||||
st_wrtstabis (stat_dic, VHL_HEDLKF, pt_paseq, cur_date, ref_date, argv [stat_flg]);
|
||||
}
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* if the save flag is set create a save file */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (nores_flg == 0)
|
||||
{
|
||||
if (pt_paseq->SAVFLG == 'Y')
|
||||
{
|
||||
if ((filepnt = mbkfopen (argv [frst_fil+1], "sav", WRITE_TEXT)) == NULL)
|
||||
{
|
||||
sprintf (filename, "%s.sav", argv [frst_fil + 1]);
|
||||
error_flag = vhu_error (116, filename, NULL);
|
||||
exit (1);
|
||||
}
|
||||
vhx_savall (filepnt, VHL_HEDLKF);
|
||||
fclose (filepnt);
|
||||
}
|
||||
}
|
||||
|
||||
beh_fretab (hshtab);
|
||||
beh_fretab (stat_dic);
|
||||
|
||||
if (nbr_errlft < max_err)
|
||||
exit (2);
|
||||
else
|
||||
exit (0);
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : vh_simulad.h */
|
||||
/* date : Aug 18 1997 */
|
||||
/* version : v3.0 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* content : declaration of functions and global variables used by */
|
||||
/* the simulator */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#define VHX_DLTDFN 10000
|
|
@ -0,0 +1,390 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : vh_util.c */
|
||||
/* date : Dec 13 1999 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* version : v3.02 */
|
||||
/* description : This file contains some utility functions : */
|
||||
/* vhu_splitname, vhu_alloc, vhu_message, vhu_warning, */
|
||||
/* vhu_toolbug , vhu_error, vhu_avers */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "vh_util.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : vhu_splitname */
|
||||
/* description : split a name onto an instance name and a signal name */
|
||||
/* called func. : namalloc */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void vhu_splitname (name, ins_name, sig_name)
|
||||
|
||||
char *name ;
|
||||
char **ins_name;
|
||||
char **sig_name;
|
||||
|
||||
{
|
||||
unsigned int i = 0;
|
||||
unsigned int j = 0;
|
||||
char buf [256] ;
|
||||
|
||||
for (i=0 ; name [i] != '\0' ; i++)
|
||||
{
|
||||
if (name [i] == '.')
|
||||
j = i + 1;
|
||||
}
|
||||
|
||||
if ((j != 0) && (j != i))
|
||||
{
|
||||
strcpy (buf, name);
|
||||
buf [j-1] = '\0';
|
||||
*ins_name = namealloc (buf );
|
||||
*sig_name = namealloc (buf + j);
|
||||
}
|
||||
else
|
||||
{
|
||||
*ins_name = NULL;
|
||||
*sig_name = name;
|
||||
}
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : vhu_alloc */
|
||||
/* description : make memory allocation */
|
||||
/* called func. : mbkalloc */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
char *vhu_alloc (size, mode)
|
||||
|
||||
unsigned int size;
|
||||
char mode;
|
||||
|
||||
{
|
||||
static char *mem_pt = NULL;
|
||||
static unsigned int mem_idx = 0 ;
|
||||
char *res_pt = NULL;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* align the size on a multiple of 4 */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (size >= VHU_MEMALC)
|
||||
res_pt = (char *) mbkalloc (size);
|
||||
else
|
||||
{
|
||||
if (mode == VHU_ALIGN)
|
||||
{
|
||||
mem_idx = (mem_idx + 3) & 0xfffffffc;
|
||||
size = (size + 3) & 0xfffffffc;
|
||||
}
|
||||
|
||||
if ((mem_pt == NULL) || ((mem_idx + size) > VHU_MEMALC))
|
||||
{
|
||||
mem_pt = (char *) mbkalloc (VHU_MEMALC);
|
||||
mem_idx = 0;
|
||||
}
|
||||
|
||||
res_pt = mem_pt + mem_idx;
|
||||
mem_idx += size ;
|
||||
}
|
||||
|
||||
return (res_pt);
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : vhu_avers */
|
||||
/* description : return the current version */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
char *vhu_avers ()
|
||||
{
|
||||
return ("v3.02");
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : vhu_warning */
|
||||
/* description : print a warning message corresponding to the argument */
|
||||
/* code */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void vhu_warning (code, str1, str2)
|
||||
|
||||
int code;
|
||||
char *str1;
|
||||
char *str2;
|
||||
|
||||
{
|
||||
fprintf (stderr, "Warning %d : ", code);
|
||||
switch (code)
|
||||
{
|
||||
case 1:
|
||||
fprintf (stderr, "cannot find register `%s`\n", str1);
|
||||
break;
|
||||
case 2:
|
||||
fprintf (stderr, "consistency checks will be disabled\n");
|
||||
break;
|
||||
case 3:
|
||||
fprintf (stderr, "signal `%s` never used\n", str1);
|
||||
break;
|
||||
case 4:
|
||||
fprintf (stderr, "cannot restore the mode of port `%s`\n", str1);
|
||||
break;
|
||||
case 5:
|
||||
fprintf (stderr, "pattern is loaded while the scheduler isn't empty\n");
|
||||
break;
|
||||
|
||||
case 112:
|
||||
fprintf (stderr, "driver conflict on `%s`\n", str1);
|
||||
break;
|
||||
case 121:
|
||||
fprintf (stderr, "driver conflict on `%s` in `%s`\n", str2, str1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : vhu_toolbug */
|
||||
/* description : print a fatal error message corresponding to the */
|
||||
/* argument code and exit */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void vhu_toolbug (code, str1, str2, nbr1)
|
||||
|
||||
int code;
|
||||
char *str1;
|
||||
char *str2;
|
||||
int nbr1;
|
||||
|
||||
{
|
||||
fprintf (stderr, "Fatal error %d executing `%s`: ", code, str1);
|
||||
switch (code)
|
||||
{
|
||||
case 1:
|
||||
fprintf (stderr, "unknown operator\n");
|
||||
break;
|
||||
case 2:
|
||||
fprintf (stderr, "cannot create empty atom\n");
|
||||
break;
|
||||
case 7:
|
||||
fprintf (stderr, "unknown type `%c` for IO `%s`\n", nbr1, str2);
|
||||
break;
|
||||
case 8:
|
||||
fprintf (stderr, "illegal signal value : hex `%x`\n", nbr1);
|
||||
break;
|
||||
case 13 :
|
||||
fprintf (stderr, "cannot find model of `%s`\n", str2);
|
||||
break;
|
||||
case 18:
|
||||
fprintf (stderr, "unknown mode `%c` for port `%s`\n", nbr1, str2);
|
||||
break;
|
||||
case 19:
|
||||
fprintf (stderr, "unknown type `%c` for input `%s`\n", nbr1, str2);
|
||||
break;
|
||||
case 20:
|
||||
fprintf (stderr, "`%s` no such locon\n", str2);
|
||||
break;
|
||||
case 21:
|
||||
fprintf (stderr, "illegal direction `%c` for `%s`\n", nbr1, str2);
|
||||
break;
|
||||
case 22:
|
||||
fprintf (stderr, "`%s`: `%c` unknown resolution func.\n", str2, nbr1);
|
||||
break;
|
||||
default:
|
||||
fprintf (stderr, "BUG\n");
|
||||
}
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : vhu_message */
|
||||
/* description : print a message corresponding to the argument code */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void vhu_message (code, str1, nmb1)
|
||||
|
||||
int code;
|
||||
char *str1;
|
||||
int nmb1;
|
||||
|
||||
{
|
||||
switch (code)
|
||||
{
|
||||
case 0:
|
||||
fprintf (stdout, "\nasimut %s\n", vhu_avers());
|
||||
break;
|
||||
case 1:
|
||||
fprintf (stdout, "usage : asimut [options] [files]\n");
|
||||
fprintf (stdout, " : asimut -h\n");
|
||||
break;
|
||||
case 2:
|
||||
fprintf (stdout, "initializing ...\n");
|
||||
break;
|
||||
case 3:
|
||||
fprintf (stdout, "compiling `%s` (Behaviour) ...\n",str1);
|
||||
break;
|
||||
case 4:
|
||||
fprintf (stdout, "compiling `%s` (Structural) ...\n\n",str1);
|
||||
break;
|
||||
case 5:
|
||||
fprintf (stdout, "searching `%s` ...\n",str1);
|
||||
break;
|
||||
case 6:
|
||||
fprintf (stdout, "searching pattern file : `%s` ...\n",str1);
|
||||
break;
|
||||
case 8:
|
||||
fprintf (stdout, "compiling `%s` (Pattern) ...\n\n",str1);
|
||||
break;
|
||||
case 9:
|
||||
fprintf (stdout, "linking ...\n");
|
||||
break;
|
||||
case 10:
|
||||
fprintf (stdout, "###----- processing pattern %d -----###\n",nmb1);
|
||||
break;
|
||||
case 11:
|
||||
fprintf (stdout, "executing ...\n");
|
||||
break;
|
||||
case 12:
|
||||
fprintf (stdout, "generating the file '%s' ...\n",str1);
|
||||
break;
|
||||
case 13:
|
||||
fprintf (stdout, "of the figure '%s'.\n",str1);
|
||||
break;
|
||||
case 14:
|
||||
fprintf (stdout, "file '%s' has been generated.\n",str1);
|
||||
break;
|
||||
case 15:
|
||||
fprintf (stdout, "making %s ...\n\n", str1);
|
||||
break;
|
||||
case 16:
|
||||
fprintf (stdout, "restoring ...\n\n");
|
||||
break;
|
||||
case 17:
|
||||
fprintf (stdout, "creating the core file ...\n\n");
|
||||
break;
|
||||
case 18:
|
||||
fprintf (stdout, "flattening the root figure ...\n\n");
|
||||
break;
|
||||
case 19:
|
||||
fprintf (stdout, "stop mark set on the current structure\n");
|
||||
break;
|
||||
case 20:
|
||||
fprintf (stdout, "--- STACK OVERFLOW !! ---\n");
|
||||
break;
|
||||
case 21:
|
||||
fprintf (stdout, "\tParis, France, Europe, Earth, Solar system, Milky Way, ...\n");
|
||||
break;
|
||||
case 22:
|
||||
fprintf (stdout, "###----- processing pattern %d : %s -----###\n",nmb1, str1);
|
||||
break;
|
||||
case 100:
|
||||
fprintf (stdout, "\nasimut %s\n", vhu_avers());
|
||||
break;
|
||||
case 101:
|
||||
fprintf (stdout, "usage : asimut [options] [files]\n");
|
||||
fprintf (stdout, " : asimut -h\n");
|
||||
break;
|
||||
default:
|
||||
fprintf (stderr, "vhu_message : code %d unknown.\n",code);
|
||||
}
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : vhu_error */
|
||||
/* description : print an error message depending on the argument code */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
int vhu_error (code, str1, str2)
|
||||
|
||||
int code;
|
||||
char *str1;
|
||||
char *str2;
|
||||
|
||||
{
|
||||
if (code < 200)
|
||||
fprintf (stderr, "Error %d: ", code);
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case 100:
|
||||
fprintf (stderr, "cannot find `%s`\n", str1);
|
||||
break;
|
||||
case 101:
|
||||
fprintf (stderr, "cannot find signal `%s`\n", str1);
|
||||
break;
|
||||
case 102:
|
||||
fprintf (stderr, "instance and model of `%s` mismatch\n", str1);
|
||||
break;
|
||||
case 103:
|
||||
fprintf (stderr, "incompatible input/output mode for `%s`\n", str1);
|
||||
break;
|
||||
case 104:
|
||||
fprintf (stderr, "input/output `%s` doesn't exist\n", str1);
|
||||
break;
|
||||
case 105:
|
||||
fprintf (stderr, "possible combinatory loop. Simulation aborted\n");
|
||||
break;
|
||||
case 106:
|
||||
fprintf (stderr, "too many errors. Simulation aborted\n");
|
||||
break;
|
||||
case 107:
|
||||
fprintf (stderr, "cannot open result file\n");
|
||||
break;
|
||||
case 109:
|
||||
fprintf (stderr, "signal `%s` never assigned\n", str1);
|
||||
break;
|
||||
case 110:
|
||||
fprintf (stderr, "signal `%s` not connected to any port\n", str1);
|
||||
break;
|
||||
case 111:
|
||||
fprintf (stderr, "illegal connections on signal `%s`\n", str1);
|
||||
break;
|
||||
case 112:
|
||||
fprintf (stderr, "drivers conflict on `%s`\n", str1);
|
||||
break;
|
||||
case 113:
|
||||
fprintf (stderr, "expected value differs from the simulation's result on `%s`\n", str1);
|
||||
break;
|
||||
case 114:
|
||||
fprintf (stderr, "multiple driver on unguarded signal `%s`\n", str1);
|
||||
break;
|
||||
case 115:
|
||||
fprintf (stderr, "save file doesn't match with the description\n");
|
||||
break;
|
||||
case 116:
|
||||
fprintf (stderr, "cannot open file `%s`\n", str1);
|
||||
break;
|
||||
case 117:
|
||||
fprintf (stderr, "instance `%s` doesn't exist or cannot be inspected\n", str1);
|
||||
break;
|
||||
case 118:
|
||||
fprintf (stderr, "command not understood\n");
|
||||
break;
|
||||
case 119:
|
||||
fprintf (stderr, "cannot display VOID pointer\n");
|
||||
break;
|
||||
case 120:
|
||||
fprintf (stderr, "cannot push NULL pointer\n");
|
||||
break;
|
||||
case 121:
|
||||
fprintf (stderr, "driver conflict on `%s` in `%s`\n", str2, str1);
|
||||
break;
|
||||
|
||||
case 200:
|
||||
fprintf (stderr, "\n\tcannot continue further more.\n");
|
||||
fprintf (stderr, "\n\t\thave a nice day...\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf (stderr, "unknown error code\n");
|
||||
break;
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : vh_util.h */
|
||||
/* date : Nov 13 1995 */
|
||||
/* version : v3.0 */
|
||||
/* authors : VUONG H.N., L.A. TABUSSE, P. BAZARGAN */
|
||||
/* content : contains defines, external variables and funtions used*/
|
||||
/* by utility functions */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* defines */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
#define VHU_NOALIGN 0
|
||||
#define VHU_ALIGN 1
|
||||
|
||||
#define VHU_MEMALC 4096
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* functions */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
extern char *vhu_alloc ();
|
||||
extern void vhu_splitname ();
|
||||
extern char *vhu_avers ();
|
||||
extern void vhu_warning ();
|
||||
extern void vhu_toolbug ();
|
||||
extern void vhu_message ();
|
||||
extern int vhu_error ();
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,32 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : vh_xcomm.h */
|
||||
/* date : Aug 20 1997 */
|
||||
/* version : v3.0 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* content : declaration of functions and global variables used by */
|
||||
/* the simulation funciotns */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
extern unsigned int vhx_getvalu ();
|
||||
extern unsigned int vhx_getsize ();
|
||||
extern char vhx_gexeval ();
|
||||
extern char vhx_muxbit ();
|
||||
extern char vhx_worbit ();
|
||||
extern char vhx_regbit ();
|
||||
extern char vhx_bddeval ();
|
||||
extern void vhx_savall ();
|
||||
extern void vhx_inireg ();
|
||||
extern void vhx_redpat ();
|
||||
extern int vhx_wrtpat ();
|
||||
extern struct papat *vhx_insertspypat ();
|
||||
extern void vhx_update ();
|
||||
extern int vhx_chkerr ();
|
||||
extern char vhx_initfig ();
|
||||
extern void vhx_initval ();
|
||||
extern void vhx_core ();
|
||||
extern unsigned int vhx_readinput ();
|
||||
extern void vhx_writeout ();
|
||||
extern void vhx_writebus ();
|
||||
extern char *vhx_GetInstanceName ();
|
||||
extern void vhx_vectorstat ();
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,27 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : vh_xspec.h */
|
||||
/* date : Aug 20 1997 */
|
||||
/* version : v3.0 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* content : declaration of functions and global variables used by */
|
||||
/* the simulation funciotns */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#define CTXEVT 6
|
||||
#define CTXPRB 7
|
||||
#define CTXLST 8
|
||||
#define CTXSEV 9
|
||||
#define CTXMEV 10
|
||||
|
||||
extern void traceX ();
|
||||
extern unsigned int getXcount ();
|
||||
extern void vhx_execall ();
|
||||
extern void vhx_addexec ();
|
||||
extern int vhx_execute ();
|
||||
extern unsigned int vhx_addtra ();
|
||||
extern void vhx_redtra ();
|
||||
|
||||
extern void st_wrtsta ();
|
||||
extern void st_wrtstadly ();
|
||||
extern void st_wrtstabis ();
|
|
@ -0,0 +1 @@
|
|||
SUBDIRS = src
|
|
@ -0,0 +1,47 @@
|
|||
dnl
|
||||
/*
|
||||
dnl This file is part of the Alliance CAD System
|
||||
dnl Copyright (C) Laboratoire LIP6 - Département ASIM
|
||||
dnl Universite Pierre et Marie Curie
|
||||
dnl
|
||||
dnl Home page : http://www-asim.lip6.fr/alliance/
|
||||
dnl E-mail support : mailto:alliance-support@asim.lip6.fr
|
||||
dnl
|
||||
dnl This library is free software; you can redistribute it and/or modify it
|
||||
dnl under the terms of the GNU Library General Public License as published
|
||||
dnl by the Free Software Foundation; either version 2 of the License, or (at
|
||||
dnl your option) any later version.
|
||||
dnl
|
||||
dnl Alliance VLSI CAD System is distributed in the hope that it will be
|
||||
dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
dnl Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public License along
|
||||
dnl with the GNU C Library; see the file COPYING. If not, write to the Free
|
||||
dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
dnl
|
||||
dnl Purpose : Auto stuffing Alliance
|
||||
dnl Almost ten years since I wrote this stuff, I just can't
|
||||
dnl believe it
|
||||
dnl Date : 01/02/2002
|
||||
dnl Author : Frederic Petrot <Frederic.Petrot@lip6.fr>
|
||||
dnl $Id: configure.in,v 1.1 2002/04/04 15:44:53 ludo Exp $
|
||||
dnl
|
||||
dnl
|
||||
AC_INIT(src/bvl.h)
|
||||
AM_INIT_AUTOMAKE(bvl, 1.14)
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_CC
|
||||
AC_PROG_YACC
|
||||
AM_PROG_LEX
|
||||
AC_HEADER_STDC
|
||||
AC_C_CONST
|
||||
AC_PROG_RANLIB
|
||||
|
||||
AM_ALLIANCE
|
||||
|
||||
AC_OUTPUT([
|
||||
Makefile
|
||||
src/Makefile
|
||||
])
|
|
@ -0,0 +1,53 @@
|
|||
include $(ALLIANCE_TOP)/etc/$(ALLIANCE_OS).mk
|
||||
include $(ALLIANCE_TOP)/etc/libraries.mk
|
||||
|
||||
#TARGET_LIB = $(HOME)/dev/archi/$(ALLIANCE_OS)/lib
|
||||
#TARGET_INCLUDE = $(HOME)/dev/archi/$(ALLIANCE_OS)/lib
|
||||
|
||||
LOCAL_INC = ../include
|
||||
|
||||
LOCAL_CFLAGS = $(CFLAGS) -c -g
|
||||
LOCAL_CPPFLAGS = $(CPPFLAGS) -I$(LOCAL_INC) \
|
||||
-I$(ALLIANCE_INCLUDE) \
|
||||
-DMUT_H='<$(MUT_H)>' \
|
||||
-DBEH_H='<$(BEH_H)>' \
|
||||
-DBHL_H='<$(BHL_H)>' \
|
||||
-DBVL_H='<bvl114.h>' \
|
||||
-DLOG_H='<$(LOG_H)>'
|
||||
|
||||
LOCAL_YACCFLAGS = $(YACCFLAGS) -d
|
||||
LOCAL_LEXFLAGS = $(LEXFLAGS)
|
||||
|
||||
LOCAL_ARFLAGS = $(ARFLAGS)
|
||||
|
||||
LOCAL_OBJECTS = bvl_globals.o bvl_parse.o bvl_drive.o \
|
||||
bvl_util.o bvl_yac.o bvl_lex.o
|
||||
|
||||
.c.o :
|
||||
$(CC) $(LOCAL_CFLAGS) $(LOCAL_CPPFLAGS) $<
|
||||
|
||||
$(TARGET_LIB)/libBvl114.a : $(LOCAL_OBJECTS)
|
||||
$(CP) $(LOCAL_INC)/bvl114.h $(TARGET_INCLUDE)
|
||||
$(AR) $(LOCAL_ARFLAGS) $(TARGET_LIB)/libBvl114.a $(LOCAL_OBJECTS)
|
||||
-$(RANLIB) $(TARGET_LIB)/libBvl114.a
|
||||
|
||||
bvl_lex.c : bvl_bcomp.lex bvl_yac.c
|
||||
$(LEX) $(LOCAL_LEXFLAGS) bvl_bcomp.lex
|
||||
$(SED) -e 's/YY/BVL_Y_/g' -e 's/yy/bvl_y_/g' lex.yy.c > bvl_lex.c
|
||||
$(RM) lex.yy.c
|
||||
|
||||
bvl_yac.c : bvl_bcomp.yac
|
||||
$(YACC) $(LOCAL_YACCFLAGS) bvl_bcomp.yac
|
||||
$(SED) -e 's/YY/BVL_Y_/g' -e 's/yy/bvl_y_/g' y.tab.c > bvl_yac.c
|
||||
$(RM) y.tab.c
|
||||
$(SED) -e 's/YY/BVL_Y_/g' -e 's/yy/bvl_y_/g' y.tab.h > bvl_yac.h
|
||||
$(RM) y.tab.h
|
||||
|
||||
distrib : $(TARGET_LIB)/libBvl114.a
|
||||
|
||||
clean :
|
||||
$(RM) -f bvl_yac.h bvl_yac.c bvl_lex.c
|
||||
$(RM) -f $(LOCAL_OBJECTS)
|
||||
|
||||
realclean : clean
|
||||
$(RM) -f $(TARGET_LIB)/libBvl114.a $(TARGET_INCLUDE)/bvl114.h
|
|
@ -0,0 +1,14 @@
|
|||
CFLAGS = @ALLIANCE_CFLAGS@ \
|
||||
-DALLIANCE_TOP=\"${ALLIANCE_TOP}\"
|
||||
lib_LIBRARIES = libBvl.a
|
||||
include_HEADERS = bvl.h
|
||||
libBvl_a_SOURCES = bvl_bcomp_y.y bvl_bcomp_l.l \
|
||||
bvl_bedef.h bvl_drive.c bvl.h bvl_util.c \
|
||||
bvl_byacc.h bvl_globals.c bvl_parse.c
|
||||
|
||||
CLEANFILES = bvl_bcomp_y.c bvl_bcomp_y.h bvl_bcomp_l.c
|
||||
|
||||
bvl_bcomp_y.c bvl_bcomp_y.h : $(srcdir)/bvl_bcomp_y.y
|
||||
$(YACC) -d $(YFLAGS) $(srcdir)/bvl_bcomp_y.y && sed -e "s/yy/bvl_y_/g" -e "s/YY/BVL_Y_/g" y.tab.c > bvl_bcomp_y.c && sed -e "s/yy/bvl_y_/g" -e "s/YY/BVL_Y_/g" y.tab.h > bvl_bcomp_y.h
|
||||
bvl_bcomp_l.c : $(srcdir)/bvl_bcomp_l.l bvl_bcomp_y.h
|
||||
$(LEX) -t $(srcdir)/bvl_bcomp_l.l | sed -e "s/yy/bvl_y_/g" -e "s/YY/BVL_Y_/g" > bvl_bcomp_l.c
|
|
@ -0,0 +1,77 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : bvl114.h */
|
||||
/* date : Feb 28 2000 */
|
||||
/* version : v114 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* contents : defines and structure definitions used in BVL library */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#ifndef BEH_BVLDEF
|
||||
#define BEH_BVLDEF
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* defines */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
#define BVL_TRACE 0x00000001 /* print messages when parsing */
|
||||
#define BVL_KEEPAUX 0x00000002 /* keep internal signals */
|
||||
#define BVL_CHECKEMPTY 0x00000004 /* check for empty architecture */
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* data structures */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
typedef struct bvl_expr /* a signal's expression */
|
||||
{
|
||||
char *IDENT ; /* identifier or constant name */
|
||||
unsigned int TIME ; /* waveform's delay */
|
||||
struct chain *LIST_ABL; /* pointer on a list of ABL */
|
||||
short WIDTH ; /* width of bit vector */
|
||||
}
|
||||
bvl_ablstr;
|
||||
|
||||
typedef struct /* an object name */
|
||||
{
|
||||
char *NAME ; /* identifier name */
|
||||
short LEFT ; /* vector's left index */
|
||||
short RIGHT ; /* vector's right index */
|
||||
char FLAG ; /* scalar ('S') or array 'A' */
|
||||
}
|
||||
bvl_name;
|
||||
|
||||
struct g_type
|
||||
{
|
||||
int VALU;
|
||||
char FLAG;
|
||||
};
|
||||
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* global variables */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
extern int BVL_AUXMOD ; /* don't keep internal sig (=1) */
|
||||
extern char BVL_ERRFLG ; /* error flag */
|
||||
extern char BVL_CURFIL []; /* current file name */
|
||||
extern struct befig *BVL_HEDFIG ; /* list of descriptions */
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* functions */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
extern char *bvl_getvers ();
|
||||
extern void bvl_error ();
|
||||
extern char *bvl_abl2str ();
|
||||
extern struct bepor *bvl_vpor ();
|
||||
extern struct beaux *bvl_vaux ();
|
||||
extern struct bebux *bvl_vbux ();
|
||||
extern struct bereg *bvl_vreg ();
|
||||
|
||||
extern char *bvl_printabl ();
|
||||
extern void bvl_message ();
|
||||
|
||||
extern struct befig *vhdlloadbefig ();
|
||||
extern int vhdlsavebefig ();
|
||||
|
||||
#endif
|
|
@ -0,0 +1,245 @@
|
|||
%{
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "mut.h"
|
||||
#include "beh.h"
|
||||
#include "bvl.h"
|
||||
#include "bvl_bcomp_y.h"
|
||||
|
||||
%}
|
||||
|
||||
upper_case_letter [A-Z]
|
||||
digit [0-9]
|
||||
special_character [\#\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\_\|]
|
||||
space_character [ \t]
|
||||
format_effector [\t\v\r\l\f]
|
||||
end_of_line \n
|
||||
lower_case_letter [a-z]
|
||||
other_special_character [\!\$\@\?\[\\\]\^\`\{\}\~]
|
||||
|
||||
graphic_character ({basic_graphic_character}|{lower_case_letter}|{other_special_character})
|
||||
basic_graphic_character ({upper_case_letter}|{digit}|{special_character}|{space_character})
|
||||
letter ({upper_case_letter}|{lower_case_letter})
|
||||
letter_or_digit ({letter}|{digit})
|
||||
decimal_literal {integer}(\.{integer})?({exponent})?
|
||||
integer {digit}(_?{digit})*
|
||||
exponent ([eE][-+]?{integer})
|
||||
base {integer}
|
||||
based_integer {extended_digit}(_?{extended_digit})*
|
||||
extended_digit ({digit}|[a-fA-F])
|
||||
base_specifier (B|b|O|o|X|x)
|
||||
|
||||
%%
|
||||
[ \t] ;
|
||||
\n { BEH_LINNUM++; }
|
||||
\& { return (Ampersand ); }
|
||||
\' { return (Apostrophe); }
|
||||
\( { return (LeftParen ); }
|
||||
\) { return (RightParen); }
|
||||
"**" { return (DoubleStar); }
|
||||
\* { return (Star ); }
|
||||
\+ { return (Plus ); }
|
||||
\, { return (Comma ); }
|
||||
\- { return (Minus ); }
|
||||
":=" { return (VarAsgn ); }
|
||||
\: { return (Colon ); }
|
||||
\; { return (Semicolon ); }
|
||||
"<=" { return (_LESym ); }
|
||||
">=" { return (_GESym ); }
|
||||
\< { return (_LTSym ); }
|
||||
\> { return (_GTSym ); }
|
||||
= { return (_EQSym ); }
|
||||
\/= { return (_NESym ); }
|
||||
"=>" { return (Arrow ); }
|
||||
"<>" { return (Box ); }
|
||||
\| { return (Bar ); }
|
||||
! { return (Bar ); }
|
||||
\. { return (Dot ); }
|
||||
\/ { return (Slash ); }
|
||||
|
||||
{letter}(_?{letter_or_digit})* {
|
||||
int itoken;
|
||||
static int search ();
|
||||
|
||||
itoken = search (yytext);
|
||||
if (itoken == EMPTYHT)
|
||||
{
|
||||
yylval.text = namealloc (yytext);
|
||||
return (Identifier);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (itoken);
|
||||
}
|
||||
}
|
||||
({decimal_literal})|({base}#{based_integer}(\.{based_integer})?#({exponent})?)|({base}:{based_integer}(\.{based_integer})?:({exponent})?) {
|
||||
|
||||
yylval.text = mbkalloc ((unsigned int)strlen(yytext)+1);
|
||||
strcpy (yylval.text, yytext);
|
||||
return (AbstractLit);
|
||||
}
|
||||
'({graphic_character}|\"|\%)' {
|
||||
yylval.text = namealloc (yytext);
|
||||
return (CharacterLit);
|
||||
}
|
||||
(\"({graphic_character}|(\"\")|\%)*\")|(\%({graphic_character}|(\%\%)|\")*\%) {
|
||||
yylval.text = namealloc (yytext);
|
||||
return (StringLit);
|
||||
}
|
||||
{base_specifier}((\"{extended_digit}(_?{extended_digit})*\")|(\%{extended_digit}(_?{extended_digit})*\%)) {
|
||||
yylval.text = namealloc (yytext);
|
||||
return (BitStringLit);
|
||||
}
|
||||
\-\-.*$ ;
|
||||
. { return (*yytext); }
|
||||
%%
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : yywrap */
|
||||
/* description : return 1 */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
int yywrap ()
|
||||
{
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : search */
|
||||
/* description : check that an identifier is a reserved word or not */
|
||||
/* called func. : addht, addhtitem, gethtitem, namealloc */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static int search (key)
|
||||
|
||||
char *key;
|
||||
|
||||
{
|
||||
static ht *pt_hash = NULL;
|
||||
|
||||
if (pt_hash == NULL)
|
||||
{
|
||||
pt_hash = addht (107);
|
||||
|
||||
addhtitem (pt_hash, namealloc("abs") , ABS );
|
||||
addhtitem (pt_hash, namealloc("access") , ACCESS );
|
||||
addhtitem (pt_hash, namealloc("after") , AFTER );
|
||||
addhtitem (pt_hash, namealloc("alias") , ALIAS );
|
||||
addhtitem (pt_hash, namealloc("all") , ALL );
|
||||
addhtitem (pt_hash, namealloc("and") , _AND );
|
||||
addhtitem (pt_hash, namealloc("architecture") , ARCHITECTURE );
|
||||
addhtitem (pt_hash, namealloc("array") , ARRAY );
|
||||
addhtitem (pt_hash, namealloc("assert") , ASSERT );
|
||||
addhtitem (pt_hash, namealloc("attribute") , ATTRIBUTE );
|
||||
|
||||
addhtitem (pt_hash, namealloc("begin") , _BEGIN );
|
||||
addhtitem (pt_hash, namealloc("bit") , BIT );
|
||||
addhtitem (pt_hash, namealloc("bit_vector") , BIT_VECTOR );
|
||||
addhtitem (pt_hash, namealloc("block") , BLOCK );
|
||||
addhtitem (pt_hash, namealloc("body") , BODY );
|
||||
addhtitem (pt_hash, namealloc("buffer") , BUFFER );
|
||||
addhtitem (pt_hash, namealloc("bus") , BUS );
|
||||
|
||||
addhtitem (pt_hash, namealloc("case") , CASE );
|
||||
addhtitem (pt_hash, namealloc("component") , COMPONENT );
|
||||
addhtitem (pt_hash, namealloc("configuration"), CONFIGURATION);
|
||||
addhtitem (pt_hash, namealloc("constant") , CONSTANT );
|
||||
|
||||
addhtitem (pt_hash, namealloc("disconnect") , DISCONNECT );
|
||||
addhtitem (pt_hash, namealloc("downto") , DOWNTO );
|
||||
|
||||
addhtitem (pt_hash, namealloc("else") , ELSE );
|
||||
addhtitem (pt_hash, namealloc("elsif") , ELSIF );
|
||||
addhtitem (pt_hash, namealloc("end") , _END );
|
||||
addhtitem (pt_hash, namealloc("entity") , ENTITY );
|
||||
addhtitem (pt_hash, namealloc("error") , ERROR );
|
||||
addhtitem (pt_hash, namealloc("exit") , _EXIT );
|
||||
|
||||
addhtitem (pt_hash, namealloc("file") , _FILE );
|
||||
addhtitem (pt_hash, namealloc("for") , FOR );
|
||||
addhtitem (pt_hash, namealloc("fs") , FS );
|
||||
addhtitem (pt_hash, namealloc("function") , FUNCTION );
|
||||
|
||||
addhtitem (pt_hash, namealloc("generate") , GENERATE );
|
||||
addhtitem (pt_hash, namealloc("generic") , GENERIC );
|
||||
addhtitem (pt_hash, namealloc("guarded") , GUARDED );
|
||||
|
||||
addhtitem (pt_hash, namealloc("if") , IF );
|
||||
addhtitem (pt_hash, namealloc("in") , _IN );
|
||||
addhtitem (pt_hash, namealloc("inout") , _INOUT );
|
||||
addhtitem (pt_hash, namealloc("is") , IS );
|
||||
|
||||
addhtitem (pt_hash, namealloc("label") , _LABEL );
|
||||
addhtitem (pt_hash, namealloc("library") , LIBRARY );
|
||||
addhtitem (pt_hash, namealloc("linkage") , _LINKAGE );
|
||||
addhtitem (pt_hash, namealloc("loop") , LOOP );
|
||||
|
||||
addhtitem (pt_hash, namealloc("map") , MAP );
|
||||
addhtitem (pt_hash, namealloc("mod") , MOD );
|
||||
addhtitem (pt_hash, namealloc("ms") , MS );
|
||||
addhtitem (pt_hash, namealloc("mux_bit") , MUX_BIT );
|
||||
addhtitem (pt_hash, namealloc("mux_vector") , MUX_VECTOR );
|
||||
|
||||
addhtitem (pt_hash, namealloc("nand") , _NAND );
|
||||
addhtitem (pt_hash, namealloc("natural") , NATURAL );
|
||||
addhtitem (pt_hash, namealloc("new") , NEW );
|
||||
addhtitem (pt_hash, namealloc("next") , _NEXT );
|
||||
addhtitem (pt_hash, namealloc("nor") , _NOR );
|
||||
addhtitem (pt_hash, namealloc("not") , _NOT );
|
||||
addhtitem (pt_hash, namealloc("ns") , NS );
|
||||
addhtitem (pt_hash, namealloc("null") , _NULL );
|
||||
|
||||
addhtitem (pt_hash, namealloc("of") , OF );
|
||||
addhtitem (pt_hash, namealloc("on") , ON );
|
||||
addhtitem (pt_hash, namealloc("open") , OPEN );
|
||||
addhtitem (pt_hash, namealloc("or") , _OR );
|
||||
addhtitem (pt_hash, namealloc("others") , OTHERS );
|
||||
addhtitem (pt_hash, namealloc("out") , _OUT );
|
||||
|
||||
addhtitem (pt_hash, namealloc("package") , PACKAGE );
|
||||
addhtitem (pt_hash, namealloc("port") , PORT );
|
||||
addhtitem (pt_hash, namealloc("procedure") , PROCEDURE );
|
||||
addhtitem (pt_hash, namealloc("process") , PROCESS );
|
||||
addhtitem (pt_hash, namealloc("ps") , PS );
|
||||
|
||||
addhtitem (pt_hash, namealloc("range") , RANGE );
|
||||
addhtitem (pt_hash, namealloc("record") , RECORD );
|
||||
addhtitem (pt_hash, namealloc("reg_bit") , REG_BIT );
|
||||
addhtitem (pt_hash, namealloc("reg_vector") , REG_VECTOR );
|
||||
addhtitem (pt_hash, namealloc("register") , REGISTER );
|
||||
addhtitem (pt_hash, namealloc("rem") , REM );
|
||||
addhtitem (pt_hash, namealloc("report") , REPORT );
|
||||
addhtitem (pt_hash, namealloc("return") , RETURN );
|
||||
|
||||
addhtitem (pt_hash, namealloc("select") , SELECT );
|
||||
addhtitem (pt_hash, namealloc("severity") , SEVERITY );
|
||||
addhtitem (pt_hash, namealloc("signal") , SIGNAL );
|
||||
addhtitem (pt_hash, namealloc("stable") , _STABLE );
|
||||
addhtitem (pt_hash, namealloc("subtype") , SUBTYPE );
|
||||
|
||||
addhtitem (pt_hash, namealloc("then") , THEN );
|
||||
addhtitem (pt_hash, namealloc("to") , TO );
|
||||
addhtitem (pt_hash, namealloc("transport") , TRANSPORT );
|
||||
addhtitem (pt_hash, namealloc("type") , _TYPE );
|
||||
|
||||
addhtitem (pt_hash, namealloc("units") , UNITS );
|
||||
addhtitem (pt_hash, namealloc("until") , UNTIL );
|
||||
addhtitem (pt_hash, namealloc("us") , US );
|
||||
addhtitem (pt_hash, namealloc("use") , USE );
|
||||
|
||||
addhtitem (pt_hash, namealloc("variable") , VARIABLE );
|
||||
|
||||
addhtitem (pt_hash, namealloc("wait") , WAIT );
|
||||
addhtitem (pt_hash, namealloc("warning") , WARNING );
|
||||
addhtitem (pt_hash, namealloc("when") , WHEN );
|
||||
addhtitem (pt_hash, namealloc("while") , WHILE );
|
||||
addhtitem (pt_hash, namealloc("with") , WITH );
|
||||
addhtitem (pt_hash, namealloc("wor_bit") , WOR_BIT );
|
||||
addhtitem (pt_hash, namealloc("wor_vector") , WOR_VECTOR );
|
||||
|
||||
addhtitem (pt_hash, namealloc("xor") , _XOR );
|
||||
}
|
||||
|
||||
return (gethtitem (pt_hash, namealloc(key)));
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,50 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : bvl_bedef.h */
|
||||
/* date : Jan 18 1993 */
|
||||
/* version : v106 */
|
||||
/* author : P.BAZARGAN, L.A.TABUSSE, VUONG H.N. */
|
||||
/* content : declaration of define used by yacc */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#define BVL_ICNDFN 1 /* input port */
|
||||
#define BVL_OCNDFN 2 /* output port */
|
||||
#define BVL_BCNDFN 3 /* inout port */
|
||||
#define BVL_CSTDFN 4 /* constant */
|
||||
|
||||
#define BVL_BITDFN 8 /* bit type */
|
||||
#define BVL_MUXDFN 16 /* mux_bit type */
|
||||
#define BVL_WORDFN 24 /* wor_bit type */
|
||||
#define BVL_RBIDFN 32 /* reg_bit type */
|
||||
#define BVL_BTVDFN 40 /* bit_vector type */
|
||||
#define BVL_MXVDFN 48 /* mux_vector type */
|
||||
#define BVL_WRVDFN 56 /* wor_vector type */
|
||||
#define BVL_RGVDFN 64 /* reg_vector type */
|
||||
#define BVL_NATDFN 88 /* natural type */
|
||||
#define BVL_NTVDFN 96 /* nat_vector type */
|
||||
|
||||
#define BVL_NORDFN 128 /* non guarded signal */
|
||||
#define BVL_BUSDFN 256 /* guarded signal (bus) */
|
||||
#define BVL_REGDFN 384 /* guarded signal (register)*/
|
||||
|
||||
#define BVL_MODDFN 0 /* field # 0 of dictionnary */
|
||||
#define BVL_SIGDFN 1 /* field # 1 of dictionnary */
|
||||
#define BVL_STBDFN 3 /* field # 3 of dictionnary */
|
||||
#define BVL_LBLDFN 4 /* field # 4 of dictionnary */
|
||||
#define BVL_WMXDFN 5 /* field # 5 of dictionnary */
|
||||
#define BVL_WMNDFN 6 /* field # 6 of dictionnary */
|
||||
#define BVL_PNTDFN 7 /* field # 7 of dictionnary */
|
||||
|
||||
#define BVL_UPTDFN 1 /* direction is up */
|
||||
#define BVL_DWTDFN 0 /* direction is down */
|
||||
|
||||
#define NE 9
|
||||
#define EQ 10
|
||||
#define NOPI 11
|
||||
#define NOPS 12
|
||||
#define ANDM 13
|
||||
#define CONC 14
|
||||
#define CONVRT 15
|
||||
|
||||
#define BVL_UNGDFN 0
|
||||
#define BVL_GRDDFN 1
|
|
@ -0,0 +1,31 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : bvl_byacc.h */
|
||||
/* date : Mar 8 2000 */
|
||||
/* version : v114 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* content : declaration of external functions and global variables*/
|
||||
/* used by yacc */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
static pNode BVL_BDDPNT = NULL;/* BDD pointer */
|
||||
static char *BVL_MODNAM; /* curnennt model name */
|
||||
static bvl_ablstr BVL_SLCEXP; /* structure filled with the */
|
||||
|
||||
static bvl_ablstr BVL_EMPSTR; /* empty structure used with NOT*/
|
||||
static char *BVL_LBLNAM = NULL;/* label */
|
||||
static struct chain *BVL_NM1LST = NULL;/* 1-st name liste */
|
||||
static struct chain *BVL_GRDLST = NULL;/* list of guard's ABL */
|
||||
static struct chain *BVL_CNDLST = NULL;/* list of conditions (ABL) */
|
||||
static struct chain *BVL_VALLST = NULL;/* list of waveforms (ABL) */
|
||||
static struct befig *BVL_BEFPNT = NULL;/* current BEFIG pointer */
|
||||
static struct begen *BVL_GENPNT = NULL;
|
||||
static struct beden **dic = NULL;/* dictionary */
|
||||
|
||||
static float BVL_CNVFS = 1.0 ;/* convert Fs */
|
||||
static float BVL_CNVPS = 1.0 ;/* convert Ps */
|
||||
static float BVL_CNVNS = 1.0 ;/* convert Ns */
|
||||
static float BVL_CNVUS = 1.0 ;/* convert Us */
|
||||
static float BVL_CNVMS = 1.0 ;/* convert Ms */
|
||||
|
||||
static struct chain *BVL_INTLST = NULL;
|
|
@ -0,0 +1,603 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : bvl_drive.c */
|
||||
/* date : Feb 28 2000 */
|
||||
/* version : v114 */
|
||||
/* author : VUONG H.N., Pirouz BAZARGAN SABET */
|
||||
/* description : This file contains VHDL drivers : */
|
||||
/* vhdlsavebefig */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "bhl.h"
|
||||
#include "bvl.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : vhdlsavebefig */
|
||||
/* description : print out a text file containing a data-flow VHDL */
|
||||
/* description */
|
||||
/* called func. : beh_vhdlname, mbkalloc, beh_message, beh_error , */
|
||||
/* beh_toolbug , getptype, reverse , bvl_abl2str */
|
||||
/* bvl_getvers */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
int vhdlsavebefig (pt_fig, trace_mode)
|
||||
|
||||
struct befig *pt_fig ;
|
||||
int trace_mode;
|
||||
|
||||
{
|
||||
struct begen *pt_gen = NULL; /* current ptype pnt (generic) */
|
||||
struct bereg *pt_reg = NULL; /* current BEREG pointer */
|
||||
struct bemsg *pt_msg = NULL; /* current BEMSG pointer */
|
||||
struct beout *pt_out = NULL; /* current BEOUT pointer */
|
||||
struct bebus *pt_bus = NULL; /* current BEBUS pointer */
|
||||
struct beaux *pt_aux = NULL; /* current BEAUX pointer */
|
||||
struct bebux *pt_bux = NULL; /* current BEBUX pointer */
|
||||
struct bepor *pt_por = NULL; /* correctly ordered port list */
|
||||
struct biabl *ptbiabl = NULL; /* current BIABL pointer */
|
||||
char *suffix ;
|
||||
char *str ;
|
||||
char *mode ;
|
||||
char *type ;
|
||||
char *kind ;
|
||||
char *direct ;
|
||||
char *transp ;
|
||||
int nrlabel = 0;
|
||||
int buff_size = 128;
|
||||
char *buffer ;
|
||||
FILE *fp ;
|
||||
time_t clock ;
|
||||
int left ;
|
||||
int right ;
|
||||
char name [256];
|
||||
char *time_unit ;
|
||||
unsigned int time_step ;
|
||||
int err_flg = 0;
|
||||
|
||||
if ((pt_fig == NULL) || (pt_fig->ERRFLG != 0))
|
||||
beh_toolbug (10, "vhdlsavebefig", NULL, 0);
|
||||
|
||||
time_step = pt_fig->TIME_STEP;
|
||||
|
||||
buffer = mbkalloc (buff_size);
|
||||
buffer [0] = '\0';
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* open result file */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if ((str = mbkgetenv ("VH_BEHSFX")) != NULL)
|
||||
suffix = strtok (str, ":");
|
||||
else
|
||||
suffix = "vbe";
|
||||
|
||||
if ((fp = mbkfopen (pt_fig->NAME, suffix, WRITE_TEXT)) == NULL)
|
||||
err_flg = beh_error (107, NULL);
|
||||
else
|
||||
{
|
||||
if (trace_mode == 1)
|
||||
beh_message (13, pt_fig->NAME);
|
||||
|
||||
time (&clock);
|
||||
fprintf (fp, "-- VHDL description generated from `%s`\n", pt_fig->NAME);
|
||||
fprintf (fp, "--\t\tdate : %s" , ctime (&clock));
|
||||
fprintf (fp, "--\t\trevision : %s\n\n", bvl_getvers ());
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* entity declaration */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
fprintf (fp, "-- Entity Declaration\n\n");
|
||||
fprintf (fp, "ENTITY %s IS\n", beh_vhdlname (pt_fig->NAME));
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* generic declaration */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if ((pt_gen = pt_fig->BEGEN) != NULL)
|
||||
{
|
||||
pt_gen = (struct begen *) reverse ((struct chain *) pt_gen);
|
||||
|
||||
fprintf (fp, " GENERIC (\n");
|
||||
while (pt_gen != NULL)
|
||||
{
|
||||
fprintf (fp, " CONSTANT %s : NATURAL := %ld",
|
||||
beh_vhdlname (pt_gen->NAME), *((long *)pt_gen->VALUE));
|
||||
|
||||
if (pt_gen->NEXT != NULL)
|
||||
fprintf (fp, ";\t-- %s\n", pt_gen->NAME);
|
||||
else
|
||||
fprintf (fp, "\t-- %s\n" , pt_gen->NAME);
|
||||
|
||||
pt_gen = pt_gen->NEXT;
|
||||
}
|
||||
|
||||
fprintf (fp, " );\n");
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* port declaration */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
pt_por = pt_fig->BEPOR;
|
||||
if (pt_por != NULL)
|
||||
{
|
||||
fprintf (fp, " PORT (\n");
|
||||
pt_fig->BEPOR = (struct bepor *) reverse ((struct chain *) pt_fig->BEPOR);
|
||||
|
||||
pt_por = pt_fig->BEPOR;
|
||||
while (pt_por != NULL)
|
||||
{
|
||||
switch (pt_por->DIRECTION)
|
||||
{
|
||||
case 'I':
|
||||
mode = "IN" ; break;
|
||||
case 'O':
|
||||
case 'Z':
|
||||
mode = "OUT" ; break;
|
||||
case 'B':
|
||||
case 'T':
|
||||
mode = "INOUT"; break;
|
||||
default :
|
||||
err_flg = beh_error (69, pt_por->NAME);
|
||||
mode = "IN" ;
|
||||
}
|
||||
|
||||
pt_por = bvl_vpor (pt_por, &left, &right, name);
|
||||
|
||||
if (left != -1)
|
||||
{
|
||||
switch (pt_por->TYPE)
|
||||
{
|
||||
case 'B':
|
||||
type = "BIT_VECTOR";
|
||||
kind = "";
|
||||
break;
|
||||
case 'W':
|
||||
type = "WOR_VECTOR";
|
||||
kind = "BUS";
|
||||
break;
|
||||
case 'M':
|
||||
type = "MUX_VECTOR";
|
||||
kind = "BUS";
|
||||
break;
|
||||
default :
|
||||
err_flg = beh_error (68, pt_por->NAME);
|
||||
type = "BIT_VECTOR";
|
||||
kind = "";
|
||||
}
|
||||
|
||||
if (left >= right)
|
||||
direct = "DOWNTO";
|
||||
else
|
||||
direct = "TO" ;
|
||||
|
||||
fprintf (fp, " SIGNAL %s : %s %s (%d %s %d) %s", beh_vhdlname (name),
|
||||
mode, type, left, direct, right, kind);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (pt_por->TYPE)
|
||||
{
|
||||
case 'B':
|
||||
type = "BIT" ; break;
|
||||
case 'W':
|
||||
type = "WOR_BIT BUS"; break;
|
||||
case 'M':
|
||||
type = "MUX_BIT BUS"; break;
|
||||
default :
|
||||
err_flg = beh_error (68, pt_por->NAME);
|
||||
type = "BIT" ;
|
||||
}
|
||||
|
||||
fprintf (fp, " SIGNAL %s : %s %s", beh_vhdlname (name), mode, type);
|
||||
}
|
||||
|
||||
if (pt_por->NEXT != NULL)
|
||||
fprintf (fp, ";\t-- %s\n" , name);
|
||||
else
|
||||
fprintf (fp, "\t-- %s\n );\n", name);
|
||||
|
||||
pt_por = pt_por->NEXT;
|
||||
}
|
||||
|
||||
pt_fig->BEPOR = (struct bepor *) reverse ((struct chain *) pt_fig->BEPOR);
|
||||
}
|
||||
|
||||
fprintf (fp, "END %s;\n\n\n", beh_vhdlname (pt_fig->NAME));
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* architecture declaration */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
fprintf (fp, "-- Architecture Declaration\n\n");
|
||||
fprintf (fp, "ARCHITECTURE behavioural OF %s IS\n",
|
||||
beh_vhdlname (pt_fig->NAME));
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* registers' decalration */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
pt_fig->BEREG = (struct bereg *) reverse ((struct chain *) pt_fig->BEREG);
|
||||
|
||||
pt_reg = pt_fig->BEREG;
|
||||
while (pt_reg != NULL)
|
||||
{
|
||||
pt_reg = bvl_vreg (pt_reg, &left, &right, name);
|
||||
|
||||
if (left != -1)
|
||||
{
|
||||
if (left >= right)
|
||||
direct = "DOWNTO";
|
||||
else
|
||||
direct = "TO" ;
|
||||
|
||||
fprintf (fp, " SIGNAL %s : REG_VECTOR (%d %s %d) REGISTER;\t-- %s\n",
|
||||
beh_vhdlname (name), left, direct, right, name);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (fp, " SIGNAL %s : REG_BIT REGISTER;\t-- %s\n",
|
||||
beh_vhdlname (name), name);
|
||||
}
|
||||
pt_reg = pt_reg->NEXT;
|
||||
}
|
||||
|
||||
pt_fig->BEREG = (struct bereg *) reverse ((struct chain *) pt_fig->BEREG);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* internal buses' declaration */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
pt_fig->BEBUX = (struct bebux *) reverse ((struct chain *) pt_fig->BEBUX);
|
||||
|
||||
pt_bux = pt_fig->BEBUX;
|
||||
while (pt_bux != NULL)
|
||||
{
|
||||
pt_bux = bvl_vbux (pt_bux, &left, &right, name);
|
||||
|
||||
if (left != -1)
|
||||
{
|
||||
switch (pt_bux->TYPE)
|
||||
{
|
||||
case 'W':
|
||||
type = "WOR_VECTOR";
|
||||
break;
|
||||
case 'M':
|
||||
type = "MUX_VECTOR";
|
||||
break;
|
||||
default :
|
||||
err_flg = beh_error (67, pt_bux->NAME);
|
||||
type = "MUX_VECTOR";
|
||||
}
|
||||
|
||||
if (left >= right)
|
||||
direct = "DOWNTO";
|
||||
else
|
||||
direct = "TO" ;
|
||||
|
||||
fprintf (fp, " SIGNAL %s : %s (%d %s %d) BUS;\t-- %s\n",
|
||||
beh_vhdlname (name), type, left, direct, right, name);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (pt_bux->TYPE)
|
||||
{
|
||||
case 'W':
|
||||
type = "WOR_BIT";
|
||||
break;
|
||||
case 'M':
|
||||
type = "MUX_BIT";
|
||||
break;
|
||||
default :
|
||||
err_flg = beh_error (67, pt_bux->NAME);
|
||||
type = "MUX_BIT";
|
||||
}
|
||||
fprintf (fp, " SIGNAL %s : %s BUS;\t\t-- %s\n", beh_vhdlname (name),
|
||||
type, name);
|
||||
}
|
||||
|
||||
pt_bux = pt_bux->NEXT;
|
||||
}
|
||||
|
||||
pt_fig->BEBUX = (struct bebux *) reverse ((struct chain *) pt_fig->BEBUX);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* simple internal signals' declaration */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
pt_fig->BEAUX = (struct beaux *) reverse ((struct chain *) pt_fig->BEAUX);
|
||||
|
||||
pt_aux = pt_fig->BEAUX;
|
||||
while (pt_aux != NULL)
|
||||
{
|
||||
pt_aux = bvl_vaux (pt_aux, &left, &right, name);
|
||||
|
||||
if (left != -1)
|
||||
{
|
||||
if (left >= right)
|
||||
direct = "DOWNTO";
|
||||
else
|
||||
direct = "TO" ;
|
||||
|
||||
fprintf (fp, " SIGNAL %s : BIT_VECTOR (%d %s %d);\t-- %s\n",
|
||||
beh_vhdlname (name), left, direct, right, name);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (fp, " SIGNAL %s : BIT;\t\t-- %s\n", beh_vhdlname(name), name);
|
||||
}
|
||||
|
||||
pt_aux = pt_aux->NEXT;
|
||||
}
|
||||
|
||||
pt_fig->BEAUX = (struct beaux *)reverse ((struct chain *) pt_fig->BEAUX);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* description part */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
fprintf (fp, "\nBEGIN\n");
|
||||
|
||||
time_unit = beh_gettimeunit (pt_fig);
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* print out a concurrent assert statement for each BEMSG */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
pt_msg = pt_fig->BEMSG;
|
||||
while (pt_msg != NULL)
|
||||
{
|
||||
if (pt_msg->LABEL != NULL)
|
||||
fprintf (fp, " %s :", pt_msg->LABEL);
|
||||
|
||||
buffer = bvl_abl2str (pt_msg->ABL, buffer, &buff_size);
|
||||
|
||||
fprintf (fp, " ASSERT (%s = '1')\n", bvl_printabl (buffer));
|
||||
buffer [0] = '\0';
|
||||
|
||||
if (pt_msg->MESSAGE != NULL)
|
||||
fprintf (fp, " REPORT %s\n", pt_msg->MESSAGE);
|
||||
|
||||
if (pt_msg->LEVEL == 'W')
|
||||
fprintf (fp, " SEVERITY WARNING;\n\n");
|
||||
else
|
||||
fprintf (fp, " SEVERITY ERROR;\n\n" );
|
||||
|
||||
pt_msg = pt_msg->NEXT;
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* concurrent signal assignment for simple internal signals */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
pt_aux = pt_fig->BEAUX;
|
||||
while (pt_aux != NULL)
|
||||
{
|
||||
if (pt_aux->ABL == NULL)
|
||||
err_flg = beh_error (40, pt_aux->NAME);
|
||||
else
|
||||
{
|
||||
buffer = bvl_abl2str (pt_aux->ABL, buffer, &buff_size);
|
||||
|
||||
if ((pt_aux->FLAG & BEH_ASG_TRANSPORT) != 0)
|
||||
transp = "TRANSPORT";
|
||||
else
|
||||
transp = "" ;
|
||||
|
||||
fprintf (fp, " %s <= %s %s", beh_vhvector (pt_aux->NAME), transp,
|
||||
bvl_printabl (buffer));
|
||||
|
||||
if (pt_aux->TIME == 0)
|
||||
fprintf (fp, ";\n");
|
||||
else
|
||||
fprintf (fp, " after %u %s;\n", pt_aux->TIME*time_step, time_unit);
|
||||
|
||||
buffer [0] = '\0';
|
||||
}
|
||||
pt_aux = pt_aux->NEXT;
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* print out a block statement with one guarded concurrent */
|
||||
/* signal assignment for each driver of each register */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
pt_reg = pt_fig->BEREG;
|
||||
while (pt_reg != NULL)
|
||||
{
|
||||
ptbiabl = pt_reg->BIABL;
|
||||
while (ptbiabl != NULL)
|
||||
{
|
||||
fprintf (fp, " label%d : BLOCK ", nrlabel);
|
||||
|
||||
if (ptbiabl->CNDABL == NULL)
|
||||
beh_toolbug (19, "vhdlsavebefig", pt_reg->NAME, 0);
|
||||
else
|
||||
{
|
||||
buffer = bvl_abl2str (ptbiabl->CNDABL, buffer, &buff_size);
|
||||
fprintf (fp, "(%s = '1')\n", bvl_printabl (buffer));
|
||||
buffer [0] = '\0';
|
||||
}
|
||||
|
||||
if ((ptbiabl->FLAG & BEH_ASG_TRANSPORT) != 0)
|
||||
transp = "TRANSPORT";
|
||||
else
|
||||
transp = "" ;
|
||||
|
||||
fprintf (fp, " BEGIN\n");
|
||||
fprintf (fp, " %s <= ", beh_vhvector (pt_reg->NAME));
|
||||
|
||||
if (ptbiabl->VALABL == NULL)
|
||||
beh_toolbug (20, "vhdlsavebefig", pt_reg->NAME, 0);
|
||||
else
|
||||
{
|
||||
buffer = bvl_abl2str (ptbiabl->VALABL, buffer, &buff_size);
|
||||
fprintf (fp, "GUARDED %s %s ", transp, bvl_printabl (buffer));
|
||||
|
||||
if (ptbiabl->TIME == 0)
|
||||
fprintf (fp, ";\n");
|
||||
else
|
||||
fprintf (fp, "after %u %s;\n", ptbiabl->TIME*time_step, time_unit);
|
||||
|
||||
buffer[0] = '\0';
|
||||
}
|
||||
|
||||
fprintf (fp, " END BLOCK label%d;\n", nrlabel);
|
||||
ptbiabl = ptbiabl->NEXT;
|
||||
nrlabel++;
|
||||
}
|
||||
|
||||
pt_reg = pt_reg->NEXT;
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* Print out a block statement with one guarded concurrent */
|
||||
/* signal assignment for each driver of each internal bus */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
pt_bux = pt_fig->BEBUX;
|
||||
while (pt_bux != NULL)
|
||||
{
|
||||
ptbiabl = pt_bux->BIABL;
|
||||
while (ptbiabl != NULL)
|
||||
{
|
||||
fprintf (fp, " label%d : BLOCK ", nrlabel);
|
||||
|
||||
if (ptbiabl->CNDABL == NULL)
|
||||
beh_toolbug (19, "vhdlsavebefig", pt_bux->NAME, 0);
|
||||
else
|
||||
{
|
||||
buffer = bvl_abl2str (ptbiabl->CNDABL, buffer, &buff_size);
|
||||
fprintf (fp, "(%s = '1')\n", bvl_printabl (buffer));
|
||||
buffer[0] = '\0';
|
||||
}
|
||||
|
||||
if ((ptbiabl->FLAG & BEH_ASG_TRANSPORT) != 0)
|
||||
transp = "TRANSPORT";
|
||||
else
|
||||
transp = "" ;
|
||||
|
||||
fprintf (fp, " BEGIN\n");
|
||||
fprintf (fp, " %s <= ", beh_vhvector (pt_bux->NAME));
|
||||
|
||||
if (ptbiabl->VALABL == NULL)
|
||||
beh_toolbug (20, "vhdlsavebefig",pt_bux->NAME,0);
|
||||
else
|
||||
{
|
||||
buffer = bvl_abl2str (ptbiabl->VALABL, buffer, &buff_size);
|
||||
fprintf (fp, "GUARDED %s %s ", transp, bvl_printabl (buffer));
|
||||
|
||||
if (ptbiabl->TIME == 0)
|
||||
fprintf (fp, ";\n");
|
||||
else
|
||||
fprintf (fp, "after %u %s;\n", ptbiabl->TIME*time_step, time_unit);
|
||||
|
||||
buffer[0] = '\0';
|
||||
}
|
||||
|
||||
fprintf (fp, " END BLOCK label%d;\n",nrlabel);
|
||||
ptbiabl = ptbiabl->NEXT;
|
||||
nrlabel++;
|
||||
}
|
||||
|
||||
pt_bux = pt_bux->NEXT;
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* Print out a block statement with one guarded concurrent */
|
||||
/* signal assignment for each driver of each bussed output */
|
||||
/* signal */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
pt_bus = pt_fig->BEBUS;
|
||||
while (pt_bus != NULL)
|
||||
{
|
||||
ptbiabl = pt_bus->BIABL;
|
||||
while (ptbiabl != NULL)
|
||||
{
|
||||
fprintf (fp, " label%d : BLOCK ", nrlabel);
|
||||
|
||||
if (ptbiabl->CNDABL == NULL)
|
||||
beh_toolbug (19, "vhdlsavebefig", pt_bus->NAME, 0);
|
||||
else
|
||||
{
|
||||
buffer = bvl_abl2str (ptbiabl->CNDABL, buffer, &buff_size);
|
||||
fprintf (fp, "(%s = '1')\n", bvl_printabl (buffer));
|
||||
buffer [0] = '\0';
|
||||
}
|
||||
|
||||
if ((ptbiabl->FLAG & BEH_ASG_TRANSPORT) != 0)
|
||||
transp = "TRANSPORT";
|
||||
else
|
||||
transp = "" ;
|
||||
|
||||
fprintf (fp, " BEGIN\n");
|
||||
fprintf (fp, " %s <= ", beh_vhvector (pt_bus->NAME));
|
||||
if (ptbiabl->VALABL == NULL)
|
||||
beh_toolbug (20, "vhdlsavebefig", pt_bus->NAME, 0);
|
||||
else
|
||||
{
|
||||
buffer = bvl_abl2str (ptbiabl->VALABL, buffer, &buff_size);
|
||||
fprintf (fp, "GUARDED %s %s ", transp, bvl_printabl (buffer));
|
||||
|
||||
if (ptbiabl->TIME == 0)
|
||||
fprintf (fp, ";\n");
|
||||
else
|
||||
fprintf (fp, "after %u %s;\n", ptbiabl->TIME*time_step, time_unit);
|
||||
buffer [0] = '\0';
|
||||
}
|
||||
|
||||
fprintf (fp, "\tEND BLOCK label%d;\n", nrlabel);
|
||||
ptbiabl = ptbiabl->NEXT;
|
||||
nrlabel++;
|
||||
}
|
||||
|
||||
pt_bus = pt_bus->NEXT;
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* print a concurrent signal assignment for each ouput port */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
pt_out = pt_fig->BEOUT;
|
||||
while (pt_out != NULL)
|
||||
{
|
||||
if (pt_out->ABL == NULL)
|
||||
err_flg = beh_error (40, pt_out->NAME);
|
||||
else
|
||||
{
|
||||
buffer = bvl_abl2str (pt_out->ABL, buffer, &buff_size);
|
||||
|
||||
if ((pt_out->FLAG & BEH_ASG_TRANSPORT) != 0)
|
||||
transp = "TRANSPORT";
|
||||
else
|
||||
transp = "" ;
|
||||
|
||||
fprintf (fp, " %s <= %s %s", beh_vhvector (pt_out->NAME), transp,
|
||||
bvl_printabl (buffer));
|
||||
|
||||
if (pt_out->TIME == 0)
|
||||
fprintf (fp, ";\n");
|
||||
else
|
||||
fprintf (fp, " after %u %s;\n", pt_out->TIME*time_step, time_unit);
|
||||
|
||||
buffer [0] = '\0';
|
||||
}
|
||||
|
||||
pt_out = pt_out->NEXT;
|
||||
}
|
||||
|
||||
fprintf (fp, "END;\n");
|
||||
fclose (fp);
|
||||
}
|
||||
|
||||
return (err_flg);
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : bvl_globals.c */
|
||||
/* date : Feb 28 2000 */
|
||||
/* version : v114 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* description : This file contains declaration of global variables */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
|
||||
int BVL_AUXMOD ; /* don't keep internal sig (=1) */
|
||||
char BVL_ERRFLG = 0 ; /* error flag */
|
||||
char BVL_CURFIL [256]; /* current file name */
|
||||
struct befig *BVL_HEDFIG = NULL; /* list of descriptions */
|
|
@ -0,0 +1,125 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : bvl_parse.c */
|
||||
/* date : Oct 30 1995 */
|
||||
/* version : v11 */
|
||||
/* author : L.A TABUSSE & H.N. VUONG & P. BAZARGAN-SABET */
|
||||
/* content : vhdlloadbefig */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "bhl.h"
|
||||
#include "bvl.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : vhdlloadbefig */
|
||||
/* description : analyze a behavioural VHDL description and produce a */
|
||||
/* set of data structure. The function returns a pointer */
|
||||
/* on a BEFIG. Errors are repported in the returned */
|
||||
/* structure. */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct befig *vhdlloadbefig (pt_befig, figname, trace_mode)
|
||||
|
||||
struct befig *pt_befig ;
|
||||
char *figname ;
|
||||
unsigned int trace_mode;
|
||||
|
||||
{
|
||||
extern FILE *bvl_y_in ;
|
||||
extern int bvl_y_parse ();
|
||||
char *tok ;
|
||||
char *str ;
|
||||
unsigned int check_mode ;
|
||||
struct chain *behsfx_lst = NULL;
|
||||
struct chain *suffix = NULL;
|
||||
static unsigned int call_nbr = 0 ;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* read the environment variable VH_BEHSFX to create a list */
|
||||
/* of suffix for behavioural files. */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if ((str = mbkgetenv ("VH_BEHSFX")) != NULL)
|
||||
{
|
||||
tok = strtok (str, ":");
|
||||
while (tok != NULL)
|
||||
{
|
||||
behsfx_lst = addchain (behsfx_lst, tok);
|
||||
tok = strtok (NULL, ":");
|
||||
}
|
||||
behsfx_lst = (struct chain *) reverse (behsfx_lst);
|
||||
}
|
||||
else
|
||||
behsfx_lst = addchain (NULL, "vbe");
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* searching the root file */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
suffix = behsfx_lst;
|
||||
while (suffix != NULL)
|
||||
{
|
||||
if ((bvl_y_in = mbkfopen (figname, suffix->DATA, READ_TEXT)) != NULL)
|
||||
{
|
||||
sprintf (BVL_CURFIL, "%s.%s", figname, (char *)suffix->DATA);
|
||||
break;
|
||||
}
|
||||
suffix = suffix->NEXT;
|
||||
}
|
||||
|
||||
if (bvl_y_in == NULL)
|
||||
{
|
||||
beh_error (100, figname);
|
||||
EXIT (1);
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* call the compiler on the current file */
|
||||
/* - print a message if the trace mode is actif */
|
||||
/* - add internal signals to the primary input list if */
|
||||
/* "keep auxiliary" mode is actif */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if ((trace_mode & BVL_TRACE) != 0)
|
||||
beh_message (3, BVL_CURFIL);
|
||||
|
||||
if ((trace_mode & BVL_KEEPAUX) != 0)
|
||||
BVL_AUXMOD = 1;
|
||||
else
|
||||
BVL_AUXMOD = 0;
|
||||
|
||||
BEH_LINNUM = 1;
|
||||
|
||||
if (call_nbr != 0)
|
||||
bvl_y_restart (bvl_y_in);
|
||||
call_nbr++;
|
||||
|
||||
bvl_y_parse ();
|
||||
fclose (bvl_y_in);
|
||||
bvl_y_in = NULL;
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* check the consistency of the compiled description */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if ((trace_mode & BVL_CHECKEMPTY) != 0)
|
||||
{
|
||||
check_mode = BEH_CHK_EMPTY;
|
||||
BVL_HEDFIG->FLAG |= BEH_ARC_C ;
|
||||
}
|
||||
else
|
||||
{
|
||||
check_mode = BEH_CHK_DRIVERS;
|
||||
BVL_HEDFIG->FLAG |= BEH_ARC_VHDL ;
|
||||
}
|
||||
|
||||
BVL_HEDFIG->ERRFLG = beh_chkbefig (BVL_HEDFIG, check_mode);
|
||||
|
||||
return (BVL_HEDFIG);
|
||||
}
|
|
@ -0,0 +1,518 @@
|
|||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* file : bvl_util.c */
|
||||
/* date : Mar 8 2000 */
|
||||
/* version : v114 */
|
||||
/* author : Pirouz BAZARGAN SABET */
|
||||
/* description : This file contains some utility functions : */
|
||||
/* bvl_getvers, bvl_error, bvl_vpor, */
|
||||
/* bvl_vaux , bvl_vbux , bvl_vreg, */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "mut.h"
|
||||
#include "log.h"
|
||||
#include "beh.h"
|
||||
#include "bvl.h"
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : bvl_getvers */
|
||||
/* description : return the revision number */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
char *bvl_getvers ()
|
||||
|
||||
{
|
||||
return ("v114");
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : bvl_error */
|
||||
/* description : print an error message */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
void bvl_error (code, str1)
|
||||
|
||||
int code;
|
||||
char *str1;
|
||||
|
||||
{
|
||||
BVL_ERRFLG++;
|
||||
fprintf (stderr, "`%s` Error %d line %d :", BVL_CURFIL, code, BEH_LINNUM);
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case 1:
|
||||
fprintf (stderr, "`%s` is incompatible with the entity name\n", str1);
|
||||
break;
|
||||
case 2:
|
||||
fprintf (stderr, "bad entity declaration\n");
|
||||
break;
|
||||
case 3:
|
||||
fprintf (stderr, "bad port clause declaration\n");
|
||||
break;
|
||||
case 4:
|
||||
fprintf (stderr, "port `%s` already declared\n", str1);
|
||||
break;
|
||||
case 5:
|
||||
fprintf (stderr, "illegal port declaration (mode, type, kind)\n");
|
||||
break;
|
||||
case 6:
|
||||
fprintf (stderr, "bad port declaration\n");
|
||||
break;
|
||||
case 7:
|
||||
fprintf (stderr, "`%s` is incompatible with the architecture name\n", str1);
|
||||
break;
|
||||
case 8:
|
||||
fprintf (stderr, "bad architecture declaration\n");
|
||||
break;
|
||||
case 9:
|
||||
fprintf (stderr, "illegal declaration\n");
|
||||
break;
|
||||
case 10:
|
||||
fprintf (stderr, "signal `%s` already declared\n", str1);
|
||||
break;
|
||||
case 11:
|
||||
fprintf (stderr, "illegal signal declaration (type, kind)\n");
|
||||
break;
|
||||
case 17:
|
||||
fprintf (stderr, "`%s` unknown port or signal\n", str1);
|
||||
break;
|
||||
case 18:
|
||||
fprintf (stderr, "illegal concurrent statement\n");
|
||||
break;
|
||||
case 19:
|
||||
fprintf (stderr, "label `%s` already declared\n", str1);
|
||||
break;
|
||||
case 20:
|
||||
fprintf (stderr, "`%s` is incompatible with the block's label\n", str1);
|
||||
break;
|
||||
case 21:
|
||||
fprintf (stderr, "input port `%s` cannot be assigned\n", str1);
|
||||
break;
|
||||
case 22:
|
||||
fprintf (stderr, "illegal unguarded signal assignment for `%s`\n", str1);
|
||||
break;
|
||||
case 23:
|
||||
fprintf (stderr, "ilegal guarded signal assignment `%s`\n", str1);
|
||||
break;
|
||||
case 25:
|
||||
fprintf (stderr, "some choices missing in the selected signal assignment\n");
|
||||
break;
|
||||
case 26:
|
||||
fprintf (stderr, "output port `%s` cannot be read\n", str1);
|
||||
break;
|
||||
case 28:
|
||||
fprintf (stderr, "duplicate choice in selected signal assignment\n");
|
||||
break;
|
||||
case 30:
|
||||
fprintf (stderr, "illegal use of OTHERS in selected signal assignment\n");
|
||||
break;
|
||||
case 32:
|
||||
fprintf (stderr, "null array not supported\n");
|
||||
break;
|
||||
case 33:
|
||||
fprintf (stderr, "incompatible constraint and type\n");
|
||||
break;
|
||||
case 35:
|
||||
fprintf (stderr, "illegal assignment of `%s` (widths mismatch)\n", str1);
|
||||
break;
|
||||
case 36:
|
||||
fprintf (stderr, "signal `%s` used out of declared range\n", str1);
|
||||
break;
|
||||
case 38:
|
||||
fprintf (stderr, "width or/and type mismatch\n");
|
||||
break;
|
||||
case 39:
|
||||
fprintf (stderr, "signal `%s` assigned more than once\n", str1);
|
||||
break;
|
||||
case 40:
|
||||
fprintf (stderr, "signal `%s` never assigned\n", str1);
|
||||
break;
|
||||
|
||||
case 68:
|
||||
fprintf (stderr, "BEPOR type is unknown\n");
|
||||
break;
|
||||
case 73:
|
||||
fprintf (stderr, "`%s` is not a bit string litteral\n", str1);
|
||||
break;
|
||||
case 74:
|
||||
fprintf (stderr, "bad generic declaration\n");
|
||||
break;
|
||||
case 75:
|
||||
fprintf (stderr, "bad generic element\n");
|
||||
break;
|
||||
case 76:
|
||||
fprintf (stderr, "`%s`: when expression must be a constant\n", str1);
|
||||
break;
|
||||
case 77:
|
||||
fprintf (stderr, "illegal generic declaration (type, kind)\n");
|
||||
break;
|
||||
case 78:
|
||||
fprintf (stderr, "illegal constant declaration (type, kind)\n");
|
||||
break;
|
||||
case 79:
|
||||
fprintf (stderr, "illegal use of attribute STABLE on `%s`\n", str1);
|
||||
break;
|
||||
case 80:
|
||||
fprintf (stderr, "different delays not supported on waveforms\n");
|
||||
break;
|
||||
case 81:
|
||||
fprintf (stderr, "unknown time unit\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf (stderr, "syntax error\n");
|
||||
break;
|
||||
}
|
||||
|
||||
if (BVL_ERRFLG > 30)
|
||||
{
|
||||
fprintf (stderr, "Too many errors. Cannot continue further more\n");
|
||||
fprintf (stderr, "\n Have a nice day ...\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : bvl_vpor */
|
||||
/* description : check a list of ports to identify a vector */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct bepor *bvl_vpor (pt_por, pt_lft, pt_rit, name)
|
||||
|
||||
struct bepor *pt_por ;
|
||||
int *pt_lft ;
|
||||
int *pt_rit ;
|
||||
char *name ;
|
||||
|
||||
{
|
||||
struct bepor *prv_por = NULL;
|
||||
int left = -1 ;
|
||||
int right = -1 ;
|
||||
int index = -1 ;
|
||||
char tmp_nam [256] ;
|
||||
|
||||
prv_por = pt_por;
|
||||
if (pt_por != NULL)
|
||||
{
|
||||
if (sscanf (pt_por->NAME, "%s %u", name, &left) == 1)
|
||||
left = -1;
|
||||
else
|
||||
{
|
||||
right = left ;
|
||||
pt_por = pt_por->NEXT;
|
||||
|
||||
while (pt_por != NULL)
|
||||
{
|
||||
if (sscanf (pt_por->NAME, "%s %u", tmp_nam, &index) == 1)
|
||||
break;
|
||||
else
|
||||
{
|
||||
if (strcmp (name, tmp_nam))
|
||||
break;
|
||||
}
|
||||
right = index ;
|
||||
prv_por = pt_por ;
|
||||
pt_por = pt_por->NEXT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*pt_lft = left ;
|
||||
*pt_rit = right;
|
||||
|
||||
return (prv_por);
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : bvl_vaux */
|
||||
/* description : check a list of simple internal signals to identify a */
|
||||
/* vector */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct beaux *bvl_vaux (pt_aux, pt_lft, pt_rit, name)
|
||||
|
||||
struct beaux *pt_aux ;
|
||||
int *pt_lft ;
|
||||
int *pt_rit ;
|
||||
char *name ;
|
||||
|
||||
{
|
||||
struct beaux *prv_aux = NULL;
|
||||
int left = -1 ;
|
||||
int right = -1 ;
|
||||
int index = -1 ;
|
||||
char tmp_nam [256] ;
|
||||
|
||||
prv_aux = pt_aux;
|
||||
if (pt_aux != NULL)
|
||||
{
|
||||
if (sscanf (pt_aux->NAME, "%s %u", name, &left) == 1)
|
||||
left = -1;
|
||||
else
|
||||
{
|
||||
right = left ;
|
||||
pt_aux = pt_aux->NEXT;
|
||||
|
||||
while (pt_aux != NULL)
|
||||
{
|
||||
if (sscanf (pt_aux->NAME, "%s %u", tmp_nam, &index) == 1)
|
||||
break;
|
||||
else
|
||||
{
|
||||
if (strcmp (name, tmp_nam))
|
||||
break;
|
||||
}
|
||||
right = index ;
|
||||
prv_aux = pt_aux ;
|
||||
pt_aux = pt_aux->NEXT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*pt_lft = left ;
|
||||
*pt_rit = right;
|
||||
|
||||
return (prv_aux);
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : bvl_vbux */
|
||||
/* description : check a list of bussed internal signals to identify a */
|
||||
/* vector */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct bebux *bvl_vbux (pt_bux, pt_lft, pt_rit, name)
|
||||
|
||||
struct bebux *pt_bux ;
|
||||
int *pt_lft ;
|
||||
int *pt_rit ;
|
||||
char *name ;
|
||||
|
||||
{
|
||||
struct bebux *prv_bux = NULL;
|
||||
int left = -1 ;
|
||||
int right = -1 ;
|
||||
int index = -1 ;
|
||||
char tmp_nam [256] ;
|
||||
|
||||
prv_bux = pt_bux;
|
||||
if (pt_bux != NULL)
|
||||
{
|
||||
if (sscanf (pt_bux->NAME, "%s %u", name, &left) == 1)
|
||||
left = -1;
|
||||
else
|
||||
{
|
||||
right = left ;
|
||||
pt_bux = pt_bux->NEXT;
|
||||
|
||||
while (pt_bux != NULL)
|
||||
{
|
||||
if (sscanf (pt_bux->NAME, "%s %u", tmp_nam, &index) == 1)
|
||||
break;
|
||||
else
|
||||
{
|
||||
if (strcmp (name, tmp_nam))
|
||||
break;
|
||||
}
|
||||
right = index ;
|
||||
prv_bux = pt_bux ;
|
||||
pt_bux = pt_bux->NEXT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*pt_lft = left ;
|
||||
*pt_rit = right;
|
||||
|
||||
return (prv_bux);
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : bvl_vreg */
|
||||
/* description : check a list of internal registers to identify a */
|
||||
/* vector */
|
||||
/* called func. : none */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
struct bereg *bvl_vreg (pt_reg, pt_lft, pt_rit, name)
|
||||
|
||||
struct bereg *pt_reg ;
|
||||
int *pt_lft ;
|
||||
int *pt_rit ;
|
||||
char *name ;
|
||||
|
||||
{
|
||||
struct bereg *prv_reg = NULL;
|
||||
int left = -1 ;
|
||||
int right = -1 ;
|
||||
int index = -1 ;
|
||||
char tmp_nam [256] ;
|
||||
|
||||
prv_reg = pt_reg;
|
||||
if (pt_reg != NULL)
|
||||
{
|
||||
if (sscanf (pt_reg->NAME, "%s %u", name, &left) == 1)
|
||||
left = -1;
|
||||
else
|
||||
{
|
||||
right = left ;
|
||||
pt_reg = pt_reg->NEXT;
|
||||
|
||||
while (pt_reg != NULL)
|
||||
{
|
||||
if (sscanf (pt_reg->NAME, "%s %u", tmp_nam, &index) == 1)
|
||||
break;
|
||||
else
|
||||
{
|
||||
if (strcmp (name, tmp_nam))
|
||||
break;
|
||||
}
|
||||
right = index ;
|
||||
prv_reg = pt_reg ;
|
||||
pt_reg = pt_reg->NEXT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*pt_lft = left ;
|
||||
*pt_rit = right;
|
||||
|
||||
return (prv_reg);
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : bvl_printabl */
|
||||
/* content : put a \n for a better presentation of an abl */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
char *bvl_printabl (chaine)
|
||||
|
||||
char *chaine;
|
||||
|
||||
{
|
||||
char *chaine_tmp = NULL;
|
||||
char *blanc = NULL;
|
||||
|
||||
chaine_tmp = chaine;
|
||||
while (strlen(chaine_tmp) > 60)
|
||||
{
|
||||
chaine_tmp = &chaine_tmp[60];
|
||||
blanc = strchr (chaine_tmp, ' ');
|
||||
if(blanc != NULL)
|
||||
{
|
||||
*blanc = '\n';
|
||||
chaine_tmp = blanc;
|
||||
}
|
||||
}
|
||||
return (chaine);
|
||||
}
|
||||
|
||||
/* ###--------------------------------------------------------------### */
|
||||
/* function : bvl_abl2str */
|
||||
/* description : return a string corresponding to an expression */
|
||||
/* called func. : */
|
||||
/* ###--------------------------------------------------------------### */
|
||||
|
||||
char *bvl_abl2str (expr, chaine, size_pnt)
|
||||
|
||||
struct chain *expr ; /* expression */
|
||||
char *chaine ; /* target string */
|
||||
int *size_pnt; /* size of available space */
|
||||
|
||||
{
|
||||
int operator;
|
||||
char *oper ;
|
||||
struct chain *operand ;
|
||||
static char *str_z = NULL;
|
||||
static char *str_o = NULL;
|
||||
static char *str_d = NULL;
|
||||
|
||||
if (str_z == NULL)
|
||||
{
|
||||
str_z = namealloc ("'0'");
|
||||
str_o = namealloc ("'1'");
|
||||
str_d = namealloc ("'d'");
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* if there is not enough space left allocate a bigger block */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (*size_pnt < (strlen (chaine) + 50))
|
||||
{
|
||||
*size_pnt = *size_pnt + 256;
|
||||
chaine = (char *) realloc (chaine, *size_pnt);
|
||||
}
|
||||
|
||||
/* ###------------------------------------------------------### */
|
||||
/* if the expression is a terminal (atom) add its name to */
|
||||
/* the previous string */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
if (expr->NEXT == NULL)
|
||||
{
|
||||
if ((expr->DATA == (void *) str_z) ||
|
||||
(expr->DATA == (void *) str_o) ||
|
||||
(expr->DATA == (void *) str_d) )
|
||||
strcat (chaine, expr->DATA);
|
||||
else
|
||||
strcat (chaine, beh_vhvector (expr->DATA));
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
/* ###------------------------------------------------------### */
|
||||
/* if the expression is not a terminal : */
|
||||
/* - for unary operators (not, stable) add */
|
||||
/* "operator ( operand )" to the previous string */
|
||||
/* */
|
||||
/* - for binary operators (and, or, nor, xor, ...) add */
|
||||
/* "(operand operator operand operator operand ...)" */
|
||||
/* ###------------------------------------------------------### */
|
||||
|
||||
operator = (int) ((struct chain *) expr->DATA)->DATA;
|
||||
operand = (struct chain *) expr->NEXT->DATA;
|
||||
|
||||
if (operator == STABLE)
|
||||
{
|
||||
strcat (chaine, beh_vhvector (operand->DATA));
|
||||
strcat (chaine, "'STABLE");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (operator == NOT)
|
||||
{
|
||||
strcat (chaine, "not (");
|
||||
chaine = bvl_abl2str (operand, chaine, size_pnt);
|
||||
}
|
||||
else
|
||||
{
|
||||
oper = operToChar (operator);
|
||||
strcat (chaine,"(");
|
||||
while ((expr = expr->NEXT) != NULL)
|
||||
{
|
||||
chaine = bvl_abl2str (expr->DATA, chaine, size_pnt);
|
||||
if ((expr->NEXT) != NULL)
|
||||
{
|
||||
strcat (chaine, " ");
|
||||
strcat (chaine, oper);
|
||||
strcat (chaine, " ");
|
||||
}
|
||||
}
|
||||
}
|
||||
strcat (chaine, ")");
|
||||
}
|
||||
}
|
||||
|
||||
return (chaine);
|
||||
}
|
Loading…
Reference in New Issue