Encore plus de fruits !

This commit is contained in:
Ludovic Jacomme 2002-04-16 13:30:58 +00:00
parent 33e32ba92e
commit fe367c577c
15 changed files with 480 additions and 230 deletions

View File

@ -110,6 +110,7 @@
# define FSM_MIXED_RTL_MASK (long)( 0x0001 ) # define FSM_MIXED_RTL_MASK (long)( 0x0001 )
# define FSM_MULTI_MASK (long)( 0x0002 ) # define FSM_MULTI_MASK (long)( 0x0002 )
# define FSM_MULTI_LEAF_MASK (long)( 0x0004 )
/*------------------------------------------------------\ /*------------------------------------------------------\
| | | |
@ -164,6 +165,10 @@
# define SetFsmFigMulti( F ) ( (F)->FLAGS |= FSM_MULTI_MASK ) # define SetFsmFigMulti( F ) ( (F)->FLAGS |= FSM_MULTI_MASK )
# define ClearFsmFigMulti( F ) ( (F)->FLAGS &= ~FSM_MULTI_MASK ) # define ClearFsmFigMulti( F ) ( (F)->FLAGS &= ~FSM_MULTI_MASK )
# define IsFsmFigMultiLeaf( F ) ( (F)->FLAGS & FSM_MULTI_LEAF_MASK )
# define SetFsmFigMultiLeaf( F ) ( (F)->FLAGS |= FSM_MULTI_LEAF_MASK )
# define ClearFsmFigMultiLeaf( F ) ( (F)->FLAGS &= ~FSM_MULTI_LEAF_MASK )
/*------------------------------------------------------\ /*------------------------------------------------------\
| | | |
| Structures | | Structures |
@ -297,6 +302,23 @@
} fsmstack_list; } fsmstack_list;
/*------------------------------------------------------\
| |
| Fsm Pragma List |
| |
\------------------------------------------------------*/
typedef struct fsmpragma_list
{
struct fsmpragma_list *NEXT;
char *TYPE;
char *NAME;
char *VALUE;
long FLAGS;
void *USER;
} fsmpragma_list;
/*------------------------------------------------------\ /*------------------------------------------------------\
| | | |
| Fsm Figure List | | Fsm Figure List |
@ -337,7 +359,7 @@
bddcircuit *CIRCUIT; bddcircuit *CIRCUIT;
long FLAGS; long FLAGS;
ptype_list *PRAGMA; fsmpragma_list *PRAGMA;
chain_list *MULTI; chain_list *MULTI;
void *FIGURE; void *FIGURE;
@ -373,6 +395,7 @@
extern fsmlocout_list * allocfsmlocout __P(()); extern fsmlocout_list * allocfsmlocout __P(());
extern fsmout_list * allocfsmout __P(()); extern fsmout_list * allocfsmout __P(());
extern fsmin_list * allocfsmin __P(()); extern fsmin_list * allocfsmin __P(());
extern fsmpragma_list * allocfsmpragma __P(());
extern fsmport_list * allocfsmport __P(()); extern fsmport_list * allocfsmport __P(());
/*------------------------------------------------------\ /*------------------------------------------------------\
@ -388,6 +411,7 @@
extern void freefsmlocout __P((fsmlocout_list *Locout)); extern void freefsmlocout __P((fsmlocout_list *Locout));
extern void freefsmout __P((fsmout_list *Output)); extern void freefsmout __P((fsmout_list *Output));
extern void freefsmin __P((fsmin_list *Input)); extern void freefsmin __P((fsmin_list *Input));
extern void freefsmpragma __P((fsmpragma_list *Pragma));
extern void freefsmport __P((fsmport_list *Port)); extern void freefsmport __P((fsmport_list *Port));
/*------------------------------------------------------\ /*------------------------------------------------------\
@ -403,6 +427,7 @@
extern fsmlocout_list * addfsmlocout __P((fsmstate_list *State, fsmout_list *Output, ablexpr *Equation, ablexpr *EquationDC)); extern fsmlocout_list * addfsmlocout __P((fsmstate_list *State, fsmout_list *Output, ablexpr *Equation, ablexpr *EquationDC));
extern fsmout_list * addfsmout __P((fsmfig_list *Figure, char *Name)); extern fsmout_list * addfsmout __P((fsmfig_list *Figure, char *Name));
extern fsmin_list * addfsmin __P((fsmfig_list *Figure, char *Name)); extern fsmin_list * addfsmin __P((fsmfig_list *Figure, char *Name));
extern fsmpragma_list * addfsmpragma __P((fsmfig_list *Figure, char *Type, char *Name, char *Value ));
extern fsmport_list * addfsmport __P((fsmfig_list *Figure, char *Name, char Dir, char Type)); extern fsmport_list * addfsmport __P((fsmfig_list *Figure, char *Name, char Dir, char Type));
/*------------------------------------------------------\ /*------------------------------------------------------\

View File

@ -333,6 +333,36 @@ fsmlocout_list *addfsmlocout( State, Output, Equation, EquationDC )
return( Locout ); return( Locout );
} }
/*------------------------------------------------------------\
| |
| Fsm Add Pragma |
| |
\------------------------------------------------------------*/
fsmpragma_list *addfsmpragma( Figure, Type, Name, Value )
fsmfig_list *Figure;
char *Type;
char *Name;
char *Value;
{
fsmpragma_list *Pragma;
Type = namealloc( Type );
Name = namealloc( Name );
Value = namealloc( Value );
Pragma = allocfsmpragma();
Pragma->TYPE = namealloc( Type );
Pragma->NAME = namealloc( Name );
Pragma->VALUE = namealloc( Value );
Pragma->NEXT = Figure->PRAGMA;
Figure->PRAGMA = Pragma;
return( Pragma );
}
/*------------------------------------------------------------\ /*------------------------------------------------------------\
| | | |
| Fsm Add Output | | Fsm Add Output |

View File

@ -157,6 +157,18 @@ fsmlocout_list *allocfsmlocout()
return( (fsmlocout_list *)(autallocheap( sizeof( fsmlocout_list ) ) ) ); return( (fsmlocout_list *)(autallocheap( sizeof( fsmlocout_list ) ) ) );
} }
/*------------------------------------------------------------\
| |
| Fsm Alloc Pragma |
| |
\------------------------------------------------------------*/
fsmpragma_list *allocfsmpragma()
{
return( (fsmpragma_list *)(autallocblock( sizeof( fsmpragma_list ) ) ) );
}
/*------------------------------------------------------------\ /*------------------------------------------------------------\
| | | |
| Fsm Alloc Input | | Fsm Alloc Input |

View File

@ -102,6 +102,8 @@ int delfsmfig( Name )
fsmstack_list *DelStack; fsmstack_list *DelStack;
fsmlocout_list *Locout; fsmlocout_list *Locout;
fsmlocout_list *DelLocout; fsmlocout_list *DelLocout;
fsmpragma_list *ScanPragma;
fsmpragma_list *DelPragma;
Name = namealloc( Name ); Name = namealloc( Name );
Previous = &HEAD_FSMFIG; Previous = &HEAD_FSMFIG;
@ -200,9 +202,14 @@ int delfsmfig( Name )
freefsmstack( DelStack ); freefsmstack( DelStack );
} }
if ( Figure->PRAGMA != (ptype_list *)0 ) ScanPragma = Figure->PRAGMA;
while ( ScanPragma != (fsmpragma_list *)0 )
{ {
freeptype( Figure->PRAGMA ); DelPragma = ScanPragma;
ScanPragma = ScanPragma->NEXT;
freefsmpragma( DelPragma );
} }
destroyauthtable( Figure->HASH_PORT ); destroyauthtable( Figure->HASH_PORT );

View File

@ -170,6 +170,19 @@ void freefsmin( Input )
autfreeblock( (char *)Input ); autfreeblock( (char *)Input );
} }
/*------------------------------------------------------------\
| |
| Fsm Free Pragma |
| |
\------------------------------------------------------------*/
void freefsmpragma( Pragma )
fsmpragma_list *Pragma;
{
autfreeblock( (char *)Pragma );
}
/*------------------------------------------------------------\ /*------------------------------------------------------------\
| | | |
| Fsm Free Port | | Fsm Free Port |

View File

@ -207,6 +207,27 @@ void viewfsmtrans( Trans )
fprintf( stdout, "\n<-- Transition" ); fprintf( stdout, "\n<-- Transition" );
} }
/*------------------------------------------------------------\
| |
| Fsm View Pragma |
| |
\------------------------------------------------------------*/
void viewfsmpragma( Pragma )
fsmpragma_list *Pragma;
{
fprintf( stdout, "\n--> Pragma" );
fprintf( stdout, "\n\t\tFLAGS : %lx", Pragma->FLAGS );
fprintf( stdout, "\n\t\tUSER : %lx", (long)Pragma->USER );
fprintf( stdout, "\n\t\tTYPE : %s", Pragma->TYPE ? Pragma->TYPE : "NULL" );
fprintf( stdout, "\n\t\tNAME : %s", Pragma->NAME ? Pragma->NAME : "NULL" );
fprintf( stdout, "\n\t\tVALUE : %s", Pragma->VALUE ? Pragma->VALUE : "NULL" );
fprintf( stdout, "\n<-- Pragma" );
}
/*------------------------------------------------------------\ /*------------------------------------------------------------\
| | | |
| Fsm View Stack | | Fsm View Stack |
@ -323,6 +344,7 @@ void viewfsmfig( Figure )
fsmstate_list *State; fsmstate_list *State;
fsmtrans_list *Trans; fsmtrans_list *Trans;
fsmstack_list *Stack; fsmstack_list *Stack;
fsmpragma_list *Pragma;
fsmin_list *Input; fsmin_list *Input;
fsmout_list *Output; fsmout_list *Output;
fsmport_list *Port; fsmport_list *Port;
@ -346,6 +368,16 @@ void viewfsmfig( Figure )
viewablexpr( Figure->CLOCK_ABL, ABL_VIEW_VHDL ); viewablexpr( Figure->CLOCK_ABL, ABL_VIEW_VHDL );
} }
fprintf( stdout, "\n\tPRAGMA : " );
for ( Pragma = Figure->PRAGMA;
Pragma != (fsmpragma_list *)0;
Pragma = Pragma->NEXT )
{
viewfsmpragma( Pragma );
}
fprintf( stdout, "\n\tPORT : " ); fprintf( stdout, "\n\tPORT : " );
for ( Port = Figure->PORT; for ( Port = Figure->PORT;

View File

@ -392,10 +392,7 @@ void FvhFbhTreatPragma( FbhFigure, FsmFigure, NumberProc )
ScanFigList->STACK_CONTROL[ FSM_CTRL_POP ] = ScanPragma->NAME; ScanFigList->STACK_CONTROL[ FSM_CTRL_POP ] = ScanPragma->NAME;
} }
/* SHOULD BE DONE BETTER !! */ addfsmpragma( FsmFigure, ScanPragma->TYPE, ScanPragma->NAME, ScanPragma->VALUE );
FsmFigure->PRAGMA = addptype( FsmFigure->PRAGMA,
(long)ScanPragma->TYPE,
ScanPragma->NAME );
} }
} }
@ -515,6 +512,8 @@ void FvhFbhTreatAux( FbhFigure, FsmFigure )
Figure = addfsmfig( ScanFigList->NAME ); Figure = addfsmfig( ScanFigList->NAME );
ScanFigList->FSM_FIGURE = Figure; ScanFigList->FSM_FIGURE = Figure;
FsmFigure->MULTI = addchain( FsmFigure->MULTI, (void *)Figure ); FsmFigure->MULTI = addchain( FsmFigure->MULTI, (void *)Figure );
SetFsmFigMultiLeaf( Figure );
} }
Figure->STAR_STATE = addfsmstate( Figure, "*" ); Figure->STAR_STATE = addfsmstate( Figure, "*" );
@ -1860,6 +1859,17 @@ void FvhFbhPostTreat( FsmFigure )
delablexpr( Equation ); delablexpr( Equation );
} }
if ( IsFsmFigMulti( FsmFigure ) )
{
Figure = ScanFigList->FSM_FIGURE;
addfsmpragma( Figure, FvhClockKeyword , ScanFigList->CLOCK , ScanFigList->NAME );
addfsmpragma( Figure, FvhCurrentStateKeyword, ScanFigList->CURRENT_STATE, ScanFigList->NAME );
addfsmpragma( Figure, FvhNextStateKeyword , ScanFigList->NEXT_STATE , ScanFigList->NAME );
addfsmpragma( Figure, FvhFirstStateKeyword , ScanFigList->FIRST_STATE , ScanFigList->NAME );
/* TO BE DONE for STACK */
}
} }
} }

View File

@ -200,71 +200,71 @@ void SyfFbhTreatPragma( FsmFigure )
fsmfig_list *FsmFigure; fsmfig_list *FsmFigure;
{ {
ptype_list *ScanPragma; fsmpragma_list *ScanPragma;
syfinfo *SyfInfo; syfinfo *SyfInfo;
char *PragmaType; char *PragmaType;
SyfInfo = FSM_SYF_INFO( FsmFigure ); SyfInfo = FSM_SYF_INFO( FsmFigure );
for ( ScanPragma = FsmFigure->PRAGMA; for ( ScanPragma = FsmFigure->PRAGMA;
ScanPragma != (ptype_list *)0; ScanPragma != (fsmpragma_list *)0;
ScanPragma = ScanPragma->NEXT ) ScanPragma = ScanPragma->NEXT )
{ {
PragmaType = (char *)ScanPragma->TYPE; PragmaType = ScanPragma->TYPE;
if ( PragmaType == SyfCurrentStateKeyword ) if ( PragmaType == SyfCurrentStateKeyword )
{ {
SyfCurrentStateName = ScanPragma->DATA; SyfCurrentStateName = ScanPragma->NAME;
} }
else else
if ( PragmaType == SyfNextStateKeyword ) if ( PragmaType == SyfNextStateKeyword )
{ {
SyfNextStateName = ScanPragma->DATA; SyfNextStateName = ScanPragma->NAME;
} }
else else
if ( PragmaType == SyfReturnStateKeyword ) if ( PragmaType == SyfReturnStateKeyword )
{ {
SyfReturnStateName = ScanPragma->DATA; SyfReturnStateName = ScanPragma->NAME;
} }
else else
if ( PragmaType == SyfControlKeyword ) if ( PragmaType == SyfControlKeyword )
{ {
SyfControlName = ScanPragma->DATA; SyfControlName = ScanPragma->NAME;
} }
else else
if ( PragmaType == SyfClockKeyword ) if ( PragmaType == SyfClockKeyword )
{ {
SyfClockName = ScanPragma->DATA; SyfClockName = ScanPragma->NAME;
} }
else else
if ( PragmaType == SyfStackControlKeyword[ FSM_CTRL_NOP ] ) if ( PragmaType == SyfStackControlKeyword[ FSM_CTRL_NOP ] )
{ {
SyfStackControlName[ FSM_CTRL_NOP ] = ScanPragma->DATA; SyfStackControlName[ FSM_CTRL_NOP ] = ScanPragma->NAME;
} }
else else
if ( PragmaType == SyfStackControlKeyword[ FSM_CTRL_PUSH ] ) if ( PragmaType == SyfStackControlKeyword[ FSM_CTRL_PUSH ] )
{ {
SyfStackControlName[ FSM_CTRL_PUSH ] = ScanPragma->DATA; SyfStackControlName[ FSM_CTRL_PUSH ] = ScanPragma->NAME;
} }
else else
if ( PragmaType == SyfStackControlKeyword[ FSM_CTRL_POP ] ) if ( PragmaType == SyfStackControlKeyword[ FSM_CTRL_POP ] )
{ {
SyfStackControlName[ FSM_CTRL_POP ] = ScanPragma->DATA; SyfStackControlName[ FSM_CTRL_POP ] = ScanPragma->NAME;
} }
else else
if ( PragmaType == SyfScanInKeyword ) if ( PragmaType == SyfScanInKeyword )
{ {
SyfScanInName = ScanPragma->DATA; SyfScanInName = ScanPragma->NAME;
} }
else else
if ( PragmaType == SyfScanOutKeyword ) if ( PragmaType == SyfScanOutKeyword )
{ {
SyfScanOutName = ScanPragma->DATA; SyfScanOutName = ScanPragma->NAME;
} }
else else
if ( PragmaType == SyfScanTestKeyword ) if ( PragmaType == SyfScanTestKeyword )
{ {
SyfScanTestName = ScanPragma->DATA; SyfScanTestName = ScanPragma->NAME;
} }
} }
@ -289,19 +289,42 @@ fsmfig_list *SyfFbhParse( Name, FlagScan )
char FlagScan; char FlagScan;
{ {
fsmfig_list *FsmFigure; fsmfig_list *FsmFigure;
fsmfig_list *ScanFigure;
chain_list *ScanChain;
syfinfo *SyfInfo; syfinfo *SyfInfo;
fsmstate_list *ScanState; fsmstate_list *ScanState;
SyfInitializeKeyword(); SyfInitializeKeyword();
FsmFigure = Syfaddfsmfig( Name ); FsmFigure = Syfaddfsmfig( Name );
SyfInfo = FSM_SYF_INFO( FsmFigure );
SyfInfo->SCAN_PATH = FlagScan;
loadfsmfig( FsmFigure, Name ); loadfsmfig( FsmFigure, Name );
ScanState = FsmFigure->STAR_STATE; if ( IsFsmFigMulti( FsmFigure ) )
{
for ( ScanChain = FsmFigure->MULTI;
ScanChain != (chain_list *)0;
ScanChain = ScanChain->NEXT )
{
ScanFigure = (fsmfig_list *)ScanChain->DATA;
SyfInfo = Syfaddfsmsyfinfo( ScanFigure );
}
}
else
{
FsmFigure->MULTI = addchain( (chain_list *)0, FsmFigure );
}
for ( ScanChain = FsmFigure->MULTI;
ScanChain != (chain_list *)0;
ScanChain = ScanChain->NEXT )
{
ScanFigure = (fsmfig_list *)ScanChain->DATA;
SyfInfo = FSM_SYF_INFO( ScanFigure );
SyfInfo->SCAN_PATH = FlagScan;
ScanState = ScanFigure->STAR_STATE;
if ( ScanState != (fsmstate_list *)0 ) if ( ScanState != (fsmstate_list *)0 )
{ {
@ -312,19 +335,20 @@ fsmfig_list *SyfFbhParse( Name, FlagScan )
ScanState->NEXT->PREV = ScanState->PREV; ScanState->NEXT->PREV = ScanState->PREV;
} }
FsmFigure->NUMBER_STATE--; ScanFigure->NUMBER_STATE--;
} }
SyfInfo->STACK = ( FsmFigure->STACK_SIZE != 0 ); SyfInfo->STACK = ( ScanFigure->STACK_SIZE != 0 );
SyfFbhTreatPragma( FsmFigure ); SyfFbhTreatPragma( ScanFigure );
SyfFbhTreatPort( FsmFigure ); SyfFbhTreatPort( ScanFigure );
for ( ScanState = FsmFigure->STATE; for ( ScanState = ScanFigure->STATE;
ScanState != (fsmstate_list *)0; ScanState != (fsmstate_list *)0;
ScanState = ScanState->NEXT ) ScanState = ScanState->NEXT )
{ {
Syfaddfsmsyfstate( FsmFigure, ScanState ); Syfaddfsmsyfstate( ScanFigure, ScanState );
}
} }
return( FsmFigure ); return( FsmFigure );

View File

@ -152,5 +152,7 @@ fsmfig_list *SyfKissParse( Name, FlagScan )
Syfaddfsmsyfout( ScanOut ); Syfaddfsmsyfout( ScanOut );
} }
FsmFigure->MULTI = addchain( (chain_list *)0, FsmFigure );
return( FsmFigure ); return( FsmFigure );
} }

View File

@ -90,6 +90,8 @@ static void SyfRemoveStable( Expr )
ablexpr *Expr; ablexpr *Expr;
{ {
if ( Expr == (ablexpr *)0 ) return;
if ( ! ABL_ATOM( Expr ) ) if ( ! ABL_ATOM( Expr ) )
{ {
if ( ABL_OPER( Expr ) == ABL_STABLE ) if ( ABL_OPER( Expr ) == ABL_STABLE )
@ -125,7 +127,8 @@ fsmfig_list *SyfCompile( FileName, FlagScan, FlagSynopsys )
char FlagSynopsys; char FlagSynopsys;
{ {
fsmfig_list *FsmFigure; fsmfig_list *FsmFigure;
syfinfo *SyfInfo; fsmfig_list *ScanFigure;
chain_list *ScanChain;
if ( FSM_IN == FSM_VHDL_FORMAT ) if ( FSM_IN == FSM_VHDL_FORMAT )
{ {
@ -138,8 +141,16 @@ fsmfig_list *SyfCompile( FileName, FlagScan, FlagSynopsys )
if ( FlagSynopsys ) if ( FlagSynopsys )
{ {
SyfInfo = FSM_SYF_INFO( FsmFigure );
SyfRemoveStable( FsmFigure->CLOCK_ABL ); SyfRemoveStable( FsmFigure->CLOCK_ABL );
for ( ScanChain = FsmFigure->MULTI;
ScanChain != (chain_list *)0;
ScanChain = ScanChain->NEXT )
{
ScanFigure = (fsmfig_list *)ScanChain->DATA;
SyfRemoveStable( ScanFigure->CLOCK_ABL );
}
} }
return( FsmFigure ); return( FsmFigure );

View File

@ -148,40 +148,24 @@ syfstate *Syfaddfsmsyfstate( Figure, State )
{ {
syfstate *SyfState; syfstate *SyfState;
syfinfo *SyfInfo; syfinfo *SyfInfo;
char *Buffer; char Buffer[ 1024 ];
int Length;
SyfInfo = FSM_SYF_INFO( Figure ); SyfInfo = FSM_SYF_INFO( Figure );
SyfState = (void *)autallocblock( sizeof( syfstate ) ); SyfState = (void *)autallocblock( sizeof( syfstate ) );
State->USER = (void *)SyfState; State->USER = (void *)SyfState;
Length = strlen( State->NAME ) + strlen( SyfInfo->CURRENT_STATE ); sprintf( Buffer, "%s_%s_%s", Figure->NAME, SyfInfo->CURRENT_STATE, State->NAME );
Buffer = autallocblock( Length + 2 );
sprintf( Buffer, "%s_%s", SyfInfo->CURRENT_STATE, State->NAME );
SyfState->CURRENT_NAME = namealloc( Buffer ); SyfState->CURRENT_NAME = namealloc( Buffer );
autfreeblock( Buffer ); sprintf( Buffer, "%s_%s_%s", Figure->NAME, SyfInfo->RETURN_STATE, State->NAME );
Length = strlen( State->NAME ) + strlen( SyfInfo->RETURN_STATE );
Buffer = autallocblock( Length + 2 );
sprintf( Buffer, "%s_%s", SyfInfo->RETURN_STATE, State->NAME );
SyfState->RETURN_NAME = namealloc( Buffer ); SyfState->RETURN_NAME = namealloc( Buffer );
autfreeblock( Buffer ); sprintf( Buffer, "%s_%s_%s", Figure->NAME, SyfInfo->NEXT_STATE, State->NAME );
Length = strlen( State->NAME ) + strlen( SyfInfo->NEXT_STATE );
Buffer = autallocblock( Length + 5 );
sprintf( Buffer, "%s_%s", SyfInfo->NEXT_STATE, State->NAME );
SyfState->NEXT_NAME = namealloc( Buffer ); SyfState->NEXT_NAME = namealloc( Buffer );
sprintf( Buffer, "%s_in_%s", SyfInfo->NEXT_STATE, State->NAME ); sprintf( Buffer, "%s_%s_in_%s", Figure->NAME, SyfInfo->NEXT_STATE, State->NAME );
SyfState->NEXT_IN_NAME = namealloc( Buffer ); SyfState->NEXT_IN_NAME = namealloc( Buffer );
autfreeblock( Buffer );
return( SyfState ); return( SyfState );
} }

View File

@ -87,7 +87,6 @@ void SyfFsmTreatPort( FsmFigure, FbhFigure )
fsmfig_list *FsmFigure; fsmfig_list *FsmFigure;
fbfig_list *FbhFigure; fbfig_list *FbhFigure;
{ {
syfinfo *SyfInfo;
fbpor_list *FbhPort; fbpor_list *FbhPort;
fbrin_list *FbhRin; fbrin_list *FbhRin;
fsmport_list *ScanPort; fsmport_list *ScanPort;
@ -97,7 +96,6 @@ void SyfFsmTreatPort( FsmFigure, FbhFigure )
return; return;
} }
SyfInfo = FSM_SYF_INFO( FsmFigure );
FbhPort = (fbpor_list *)0; FbhPort = (fbpor_list *)0;
FbhRin = FbhFigure->BERIN; FbhRin = FbhFigure->BERIN;
@ -381,6 +379,8 @@ fbfig_list *SyfFsm2Fbh( FsmFigure )
fsmfig_list *FsmFigure; fsmfig_list *FsmFigure;
{ {
fsmfig_list *ScanFigure;
chain_list *ScanChain;
fbfig_list *FbhFigure; fbfig_list *FbhFigure;
if ( ! IsFsmFigMixedRtl( FsmFigure ) ) if ( ! IsFsmFigMixedRtl( FsmFigure ) )
@ -393,9 +393,17 @@ fbfig_list *SyfFsm2Fbh( FsmFigure )
} }
SyfFsmTreatPort( FsmFigure, FbhFigure ); SyfFsmTreatPort( FsmFigure, FbhFigure );
SyfFsmTreatOutput( FsmFigure, FbhFigure );
SyfFsmTreatRegister( FsmFigure, FbhFigure ); for ( ScanChain = FsmFigure->MULTI;
SyfFsmTreatAux( FsmFigure, FbhFigure ); ScanChain != (chain_list *)0;
ScanChain = ScanChain->NEXT )
{
ScanFigure = (fsmfig_list *)ScanChain->DATA;
SyfFsmTreatOutput( ScanFigure, FbhFigure );
SyfFsmTreatRegister( ScanFigure, FbhFigure );
SyfFsmTreatAux( ScanFigure, FbhFigure );
}
return( FbhFigure ); return( FbhFigure );
} }

View File

@ -135,6 +135,8 @@ int main( argc, argv )
int argc; int argc;
char *argv[]; char *argv[];
{ {
chain_list *ScanChain;
fsmfig_list *FsmFigure;
char *InputFileName; char *InputFileName;
char *OutputFileName; char *OutputFileName;
char *FileName; char *FileName;
@ -254,8 +256,6 @@ int main( argc, argv )
SyfFsmFigure = SyfCompile( InputFileName, FlagScan, FlagFormat ); SyfFsmFigure = SyfCompile( InputFileName, FlagScan, FlagFormat );
SyfFsmFigure->NAME = namealloc( OutputFileName );
if ( FlagInvPolar ) if ( FlagInvPolar )
{ {
if ( FlagVerbose ) if ( FlagVerbose )
@ -263,7 +263,13 @@ int main( argc, argv )
fprintf( stdout, "\t\t--> Check FSM figure outputs\n" ); fprintf( stdout, "\t\t--> Check FSM figure outputs\n" );
} }
SyfFsmOutputPolarity( SyfFsmFigure ); for ( ScanChain = SyfFsmFigure->MULTI;
ScanChain != (chain_list *)0;
ScanChain = ScanChain->NEXT )
{
FsmFigure = (fsmfig_list *)ScanChain->DATA;
SyfFsmOutputPolarity( FsmFigure );
}
} }
if ( FlagVerbose ) if ( FlagVerbose )
@ -274,21 +280,39 @@ int main( argc, argv )
} }
} }
SyfFsmSimplify( SyfFsmFigure, FlagSimplify ); for ( ScanChain = SyfFsmFigure->MULTI;
ScanChain != (chain_list *)0;
ScanChain = ScanChain->NEXT )
{
FsmFigure = (fsmfig_list *)ScanChain->DATA;
SyfFsmSimplify( FsmFigure, FlagSimplify );
}
if ( FlagVerbose ) if ( FlagVerbose )
{ {
fprintf( stdout, "\t\t--> Verify FSM figure\n" ); fprintf( stdout, "\t\t--> Verify FSM figure\n" );
} }
SyfFsmVerify( SyfFsmFigure, FlagCheck ); for ( ScanChain = SyfFsmFigure->MULTI;
ScanChain != (chain_list *)0;
ScanChain = ScanChain->NEXT )
{
FsmFigure = (fsmfig_list *)ScanChain->DATA;
SyfFsmVerify( FsmFigure, FlagCheck );
}
if ( FlagVerbose ) if ( FlagVerbose )
{ {
fprintf( stdout, "\t\t--> Identify reset conditions\n" ); fprintf( stdout, "\t\t--> Identify reset conditions\n" );
} }
SyfFsmTreatReset( SyfFsmFigure ); for ( ScanChain = SyfFsmFigure->MULTI;
ScanChain != (chain_list *)0;
ScanChain = ScanChain->NEXT )
{
FsmFigure = (fsmfig_list *)ScanChain->DATA;
SyfFsmTreatReset( FsmFigure );
}
if ( FlagVerbose ) if ( FlagVerbose )
{ {
@ -298,17 +322,33 @@ int main( argc, argv )
{ {
fprintf( stdout, "\t\t--> Mixed DataFlow / Fsm\n\n" ); fprintf( stdout, "\t\t--> Mixed DataFlow / Fsm\n\n" );
} }
fprintf( stdout, "\t\t--> States : %ld\n", SyfFsmFigure->NUMBER_STATE );
fprintf( stdout, "\t\t--> Inputs : %ld\n", SyfFsmFigure->NUMBER_IN ); for ( ScanChain = SyfFsmFigure->MULTI;
fprintf( stdout, "\t\t--> Outputs : %ld\n", SyfFsmFigure->NUMBER_OUT ); ScanChain != (chain_list *)0;
fprintf( stdout, "\t\t--> Edges : %ld\n", SyfFsmFigure->NUMBER_TRANS ); ScanChain = ScanChain->NEXT )
fprintf( stdout, "\t\t--> Stacks : %ld\n", SyfFsmFigure->NUMBER_STACK ); {
FsmFigure = (fsmfig_list *)ScanChain->DATA;
fprintf( stdout, "\t\t--> Name : %s\n" , FsmFigure->NAME );
fprintf( stdout, "\t\t--> States : %ld\n", FsmFigure->NUMBER_STATE );
fprintf( stdout, "\t\t--> Inputs : %ld\n", FsmFigure->NUMBER_IN );
fprintf( stdout, "\t\t--> Outputs : %ld\n", FsmFigure->NUMBER_OUT );
fprintf( stdout, "\t\t--> Edges : %ld\n", FsmFigure->NUMBER_TRANS );
fprintf( stdout, "\t\t--> Stacks : %ld\n", FsmFigure->NUMBER_STACK );
fprintf( stdout, "\n" ); fprintf( stdout, "\n" );
}
fprintf( stdout, "\t\t--> Encode FSM figure\n" ); fprintf( stdout, "\t\t--> Encode FSM figure\n" );
} }
SyfFsmEncode( SyfFsmFigure, FlagCode, FlagVerbose, for ( ScanChain = SyfFsmFigure->MULTI;
ScanChain != (chain_list *)0;
ScanChain = ScanChain->NEXT )
{
FsmFigure = (fsmfig_list *)ScanChain->DATA;
SyfFsmEncode( FsmFigure, FlagCode, FlagVerbose,
FlagDc, FlagRegOut, FlagMustCost, InputFileName ); FlagDc, FlagRegOut, FlagMustCost, InputFileName );
}
if ( FlagSave ) if ( FlagSave )
{ {
@ -325,9 +365,15 @@ int main( argc, argv )
fprintf( stdout, "\t\t--> Translate FSM to BEH\n" ); fprintf( stdout, "\t\t--> Translate FSM to BEH\n" );
} }
SyfSynthFsmInit( SyfFsmFigure ); for ( ScanChain = SyfFsmFigure->MULTI;
SyfSynthCode2Abl( SyfFsmFigure, FlagDc ); ScanChain != (chain_list *)0;
SyfSynthFsm2Abl( SyfFsmFigure ); ScanChain = ScanChain->NEXT )
{
FsmFigure = (fsmfig_list *)ScanChain->DATA;
SyfSynthFsmInit( FsmFigure );
SyfSynthCode2Abl( FsmFigure, FlagDc );
SyfSynthFsm2Abl( FsmFigure );
}
SyfFbhFigure = SyfFsm2Fbh( SyfFsmFigure ); SyfFbhFigure = SyfFsm2Fbh( SyfFsmFigure );
@ -349,6 +395,8 @@ int main( argc, argv )
fprintf( stdout, "\t\t--> Save BEH file %s\n\n", OutputFileName ); fprintf( stdout, "\t\t--> Save BEH file %s\n\n", OutputFileName );
SyfFbhFigure->NAME = namealloc( OutputFileName );
vhdlsavefbfig( SyfFbhFigure, OutputFileName, FlagFormat ); vhdlsavefbfig( SyfFbhFigure, OutputFileName, FlagFormat );
return( 0 ); return( 0 );

View File

@ -1533,9 +1533,9 @@ void SyfSynthFsmInit( FsmFigure )
for ( Index = 0; Index < RegMax; Index++ ) for ( Index = 0; Index < RegMax; Index++ )
{ {
sprintf( Buffer, "%s %ld", SyfInfo->CURRENT_STATE, Index ); sprintf( Buffer, "%s_%s %ld", FsmFigure->NAME, SyfInfo->CURRENT_STATE, Index );
RegArray[ Index ].NAME_OUT = namealloc( Buffer ); RegArray[ Index ].NAME_OUT = namealloc( Buffer );
sprintf( Buffer, "%s %ld", SyfInfo->NEXT_STATE, Index ); sprintf( Buffer, "%s_%s %ld", FsmFigure->NAME, SyfInfo->NEXT_STATE, Index );
RegArray[ Index ].NAME_IN = namealloc( Buffer ); RegArray[ Index ].NAME_IN = namealloc( Buffer );
RegArray[ Index ].NAME_MASTER = RegArray[ Index ].NAME_OUT; RegArray[ Index ].NAME_MASTER = RegArray[ Index ].NAME_OUT;
} }
@ -1558,7 +1558,7 @@ void SyfSynthFsmInit( FsmFigure )
for ( Index = 0; Index < OutMax; Index++ ) for ( Index = 0; Index < OutMax; Index++ )
{ {
sprintf( Buffer, "regouts_%ld", Index ); sprintf( Buffer, "%s_regouts_%ld", FsmFigure->NAME, Index );
OutArray[ Index ].NAME_OUT = namealloc( Buffer ); OutArray[ Index ].NAME_OUT = namealloc( Buffer );
OutArray[ Index ].NAME_MASTER = OutArray[ Index ].NAME_OUT; OutArray[ Index ].NAME_MASTER = OutArray[ Index ].NAME_OUT;
} }
@ -1576,7 +1576,7 @@ void SyfSynthFsmInit( FsmFigure )
for ( Index = 0; Index < CtrlMax; Index++ ) for ( Index = 0; Index < CtrlMax; Index++ )
{ {
sprintf( Buffer, "ctrl_%s", FSM_CTRL_NAME[ Index ] ); sprintf( Buffer, "%s_ctrl_%s", FsmFigure->NAME, FSM_CTRL_NAME[ Index ] );
CtrlArray[ Index ].NAME = namealloc( Buffer ); CtrlArray[ Index ].NAME = namealloc( Buffer );
} }
@ -1589,7 +1589,7 @@ void SyfSynthFsmInit( FsmFigure )
{ {
for ( ScanBit = 0; ScanBit < SyfInfo->NUMBER_REG; ScanBit++ ) for ( ScanBit = 0; ScanBit < SyfInfo->NUMBER_REG; ScanBit++ )
{ {
sprintf( Buffer, "stacks_%ld_%ld", Stack, ScanBit ); sprintf( Buffer, "%s_stacks_%ld_%ld", FsmFigure->NAME, Stack, ScanBit );
StackArray[ Index ].NAME_OUT = namealloc( Buffer ); StackArray[ Index ].NAME_OUT = namealloc( Buffer );
StackArray[ Index ].NAME_MASTER = StackArray[ Index ].NAME_OUT; StackArray[ Index ].NAME_MASTER = StackArray[ Index ].NAME_OUT;

View File

@ -91,14 +91,15 @@ void SyfFsmUserSaveCode( FsmFigure, FileName )
fsmfig_list *FsmFigure; fsmfig_list *FsmFigure;
char *FileName; char *FileName;
{ {
fsmfig_list *ScanFigure;
FILE *UserFile; FILE *UserFile;
fsmstate_list *ScanState; fsmstate_list *ScanState;
chain_list *ScanChain;
syfinfo *SyfInfo; syfinfo *SyfInfo;
long Value; long Value;
long Bit; long Bit;
char OneHot; char OneHot;
SyfInfo = FSM_SYF_INFO( FsmFigure );
UserFile = mbkfopen( FileName, "enc", "w" ); UserFile = mbkfopen( FileName, "enc", "w" );
if ( UserFile == (FILE *)0 ) if ( UserFile == (FILE *)0 )
@ -106,12 +107,19 @@ void SyfFsmUserSaveCode( FsmFigure, FileName )
SyfError( SYF_ERROR_OPEN_FILE, FileName ); SyfError( SYF_ERROR_OPEN_FILE, FileName );
} }
fprintf( UserFile, "# Encoding figure \"%s\"\n", FsmFigure->NAME ); for ( ScanChain = FsmFigure->MULTI;
fprintf( UserFile, "-%c %ld\n" , SyfInfo->ENCODE, SyfInfo->NUMBER_BIT ); ScanChain != (chain_list *)0;
ScanChain = ScanChain->NEXT )
{
ScanFigure = (fsmfig_list *)ScanChain->DATA;
SyfInfo = FSM_SYF_INFO( ScanFigure );
fprintf( UserFile, "# Encoding figure \"%s\"\n", ScanFigure->NAME );
fprintf( UserFile, "-%s %c %ld\n" , ScanFigure->NAME, SyfInfo->ENCODE, SyfInfo->NUMBER_BIT );
OneHot = ( SyfInfo->ENCODE == SYF_ENCODE_ONE_HOT ); OneHot = ( SyfInfo->ENCODE == SYF_ENCODE_ONE_HOT );
for ( ScanState = FsmFigure->STATE; for ( ScanState = ScanFigure->STATE;
ScanState != (fsmstate_list *)0; ScanState != (fsmstate_list *)0;
ScanState = ScanState->NEXT ) ScanState = ScanState->NEXT )
{ {
@ -139,6 +147,7 @@ void SyfFsmUserSaveCode( FsmFigure, FileName )
fprintf( UserFile, "\n" ); fprintf( UserFile, "\n" );
} }
}
fclose( UserFile ); fclose( UserFile );
} }
@ -163,6 +172,8 @@ void SyfFsmUserEncode( FsmFigure, FileName )
authtable *HashTable; authtable *HashTable;
authelem *Element; authelem *Element;
char *StateName; char *StateName;
char *ScanName;
char *FigureName;
unsigned long StateCode; unsigned long StateCode;
long NumberState; long NumberState;
long NumberBit; long NumberBit;
@ -170,6 +181,8 @@ void SyfFsmUserEncode( FsmFigure, FileName )
unsigned long CodeMax; unsigned long CodeMax;
long Index; long Index;
long Error; long Error;
long Skip;
SyfInfo = FSM_SYF_INFO( FsmFigure ); SyfInfo = FSM_SYF_INFO( FsmFigure );
CodeMax = SyfInfo->NUMBER_CODE; CodeMax = SyfInfo->NUMBER_CODE;
@ -199,6 +212,7 @@ void SyfFsmUserEncode( FsmFigure, FileName )
CurrentLine = 1; CurrentLine = 1;
Error = 0; Error = 0;
Skip = 1;
while ( fgets( SyfUserBuffer, while ( fgets( SyfUserBuffer,
SYF_USER_BUFFER_SIZE, SYF_USER_BUFFER_SIZE,
@ -213,7 +227,21 @@ void SyfFsmUserEncode( FsmFigure, FileName )
if ( ScanBuffer[ 0 ] == '-' ) if ( ScanBuffer[ 0 ] == '-' )
{ {
if ( ScanBuffer[ 1 ] == SYF_ENCODE_ONE_HOT ) ScanBuffer = ScanBuffer + 1;
ScanName = strchr( ScanBuffer, ' ' );
if ( ScanName == (char *)0 )
{
Error = SYF_ERROR_SYNTAX; break;
}
*ScanName = '\0';
FigureName = namealloc( ScanBuffer );
ScanBuffer = ScanName + 1;
if ( FigureName == FsmFigure->NAME )
{
if ( ScanBuffer[ 0 ] == SYF_ENCODE_ONE_HOT )
{ {
CodeMax = NumberState; CodeMax = NumberState;
@ -229,9 +257,11 @@ void SyfFsmUserEncode( FsmFigure, FileName )
{ {
CodeArray[ Index ].VALUE = Index; CodeArray[ Index ].VALUE = Index;
} }
Skip = 0;
} }
else else
if ( ScanBuffer[ 1 ] == SYF_ENCODE_FRANCK ) if ( ScanBuffer[ 0 ] == SYF_ENCODE_FRANCK )
{ {
NumberBit = atoi( &ScanBuffer[ 2 ] ); NumberBit = atoi( &ScanBuffer[ 2 ] );
@ -247,14 +277,27 @@ void SyfFsmUserEncode( FsmFigure, FileName )
SyfInfo->NUMBER_CODE = NumberState; SyfInfo->NUMBER_CODE = NumberState;
SyfInfo->NUMBER_BIT = NumberBit; SyfInfo->NUMBER_BIT = NumberBit;
SyfInfo->ENCODE = SYF_ENCODE_FRANCK; SyfInfo->ENCODE = SYF_ENCODE_FRANCK;
Skip = 0;
} }
else else
{ {
Error = SYF_ERROR_SYNTAX; break; Error = SYF_ERROR_SYNTAX; break;
} }
} }
else
{
Skip = 0;
}
} }
else else
{
Skip = 1;
}
}
else
if ( ! Skip )
{
if ( ( ScanBuffer[ 0 ] != '#' ) && if ( ( ScanBuffer[ 0 ] != '#' ) &&
( ScanBuffer[ 0 ] != '\0' ) ) ( ScanBuffer[ 0 ] != '\0' ) )
{ {
@ -320,6 +363,7 @@ void SyfFsmUserEncode( FsmFigure, FileName )
NumberState--; NumberState--;
} }
}
CurrentLine++; CurrentLine++;
} }