Initial check in
This commit is contained in:
@@ -0,0 +1,9 @@
|
|||||||
|
*.dcu
|
||||||
|
*.exe
|
||||||
|
*.res
|
||||||
|
|
||||||
|
*.identcache
|
||||||
|
*.local
|
||||||
|
*.dsk
|
||||||
|
*.dsv
|
||||||
|
|
||||||
BIN
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,58 @@
|
|||||||
|
package mr.jtag;
|
||||||
|
|
||||||
|
{$R *.res}
|
||||||
|
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
|
||||||
|
{$ALIGN 8}
|
||||||
|
{$ASSERTIONS ON}
|
||||||
|
{$BOOLEVAL OFF}
|
||||||
|
{$DEBUGINFO OFF}
|
||||||
|
{$EXTENDEDSYNTAX ON}
|
||||||
|
{$IMPORTEDDATA ON}
|
||||||
|
{$IOCHECKS ON}
|
||||||
|
{$LOCALSYMBOLS ON}
|
||||||
|
{$LONGSTRINGS ON}
|
||||||
|
{$OPENSTRINGS ON}
|
||||||
|
{$OPTIMIZATION OFF}
|
||||||
|
{$OVERFLOWCHECKS ON}
|
||||||
|
{$RANGECHECKS ON}
|
||||||
|
{$REFERENCEINFO ON}
|
||||||
|
{$SAFEDIVIDE OFF}
|
||||||
|
{$STACKFRAMES ON}
|
||||||
|
{$TYPEDADDRESS OFF}
|
||||||
|
{$VARSTRINGCHECKS ON}
|
||||||
|
{$WRITEABLECONST OFF}
|
||||||
|
{$MINENUMSIZE 1}
|
||||||
|
{$IMAGEBASE $400000}
|
||||||
|
{$DEFINE DEBUG}
|
||||||
|
{$ENDIF IMPLICITBUILDING}
|
||||||
|
{$LIBVERSION '290'}
|
||||||
|
{$IMPLICITBUILD ON}
|
||||||
|
|
||||||
|
requires
|
||||||
|
rtl,
|
||||||
|
vcl;
|
||||||
|
|
||||||
|
contains
|
||||||
|
jtag.bstream in '..\..\src.jtag\jtag.bstream.pas',
|
||||||
|
jtag.types in '..\..\src.jtag\jtag.types.pas',
|
||||||
|
jtag.svfAstComment in '..\..\src.jtag\svf\jtag.svfAstComment.pas',
|
||||||
|
jtag.svfAstEndDR in '..\..\src.jtag\svf\jtag.svfAstEndDR.pas',
|
||||||
|
jtag.svfAstEndIR in '..\..\src.jtag\svf\jtag.svfAstEndIR.pas',
|
||||||
|
jtag.svfAstFreq in '..\..\src.jtag\svf\jtag.svfAstFreq.pas',
|
||||||
|
jtag.svfAstNode in '..\..\src.jtag\svf\jtag.svfAstNode.pas',
|
||||||
|
jtag.svfAstPrint in '..\..\src.jtag\svf\jtag.svfAstPrint.pas',
|
||||||
|
jtag.svfAstRuntest in '..\..\src.jtag\svf\jtag.svfAstRuntest.pas',
|
||||||
|
jtag.svfAstScan in '..\..\src.jtag\svf\jtag.svfAstScan.pas',
|
||||||
|
jtag.svfAstState in '..\..\src.jtag\svf\jtag.svfAstState.pas',
|
||||||
|
jtag.svfFreq in '..\..\src.jtag\svf\jtag.svfFreq.pas',
|
||||||
|
jtag.svfLex in '..\..\src.jtag\svf\jtag.svfLex.pas',
|
||||||
|
jtag.svfPar in '..\..\src.jtag\svf\jtag.svfPar.pas',
|
||||||
|
jtag.svfProgram in '..\..\src.jtag\svf\jtag.svfProgram.pas',
|
||||||
|
jtag.svfLexer in '..\..\src.jtag\svf\grammar\jtag.svfLexer.pas',
|
||||||
|
jtag.svfLexerTokens in '..\..\src.jtag\svf\grammar\jtag.svfLexerTokens.pas',
|
||||||
|
jtag.svfParser in '..\..\src.jtag\svf\grammar\jtag.svfParser.pas',
|
||||||
|
jtag.svfParserTokens in '..\..\src.jtag\svf\grammar\jtag.svfParserTokens.pas',
|
||||||
|
jtag.svfScanLexer in '..\..\src.jtag\svf\grammar\jtag.svfScanLexer.pas',
|
||||||
|
jtag.svfScanLexerTokens in '..\..\src.jtag\svf\grammar\jtag.svfScanLexerTokens.pas';
|
||||||
|
|
||||||
|
end.
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,48 @@
|
|||||||
|
unit jtag.types;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
type
|
||||||
|
// =========================================================================
|
||||||
|
// Keep this values synchronized with "tri.h" !!!!
|
||||||
|
// =========================================================================
|
||||||
|
TJTAGState =
|
||||||
|
(
|
||||||
|
TS_RESET = 0,
|
||||||
|
TS_IDLE = 1,
|
||||||
|
TS_IRPAUSE = 2,
|
||||||
|
TS_DRPAUSE = 3,
|
||||||
|
TS_IRSHIFT = 4,
|
||||||
|
TS_DRSHIFT = 5,
|
||||||
|
TS_DRCAPT = 6,
|
||||||
|
TS_IREXIT1 = 7,
|
||||||
|
TS_DREXIT1 = 8,
|
||||||
|
|
||||||
|
TS_UNDEF = $FF
|
||||||
|
);
|
||||||
|
|
||||||
|
IJTAG = interface
|
||||||
|
procedure init;
|
||||||
|
procedure trst( value : BYTE);
|
||||||
|
procedure ena( value : BYTE);
|
||||||
|
|
||||||
|
procedure endir( state : TJTAGState);
|
||||||
|
procedure enddr( state : TJTAGState);
|
||||||
|
procedure state( state : TJTAGState);
|
||||||
|
|
||||||
|
procedure sir( data : PBYTE; length: WORD);
|
||||||
|
procedure sdr( data : PBYTE; length: WORD);
|
||||||
|
|
||||||
|
procedure run( state : TJTAGState; count: WORD);
|
||||||
|
|
||||||
|
procedure test;
|
||||||
|
end;
|
||||||
|
|
||||||
|
IJTAGLOG = interface
|
||||||
|
procedure info( msg : string);
|
||||||
|
procedure warning( msg : string);
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,247 @@
|
|||||||
|
unit jtag.svfLexer;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This section is used for generating "uses" clause in the unit 'svfLexer'.
|
||||||
|
// Every unit name must be terminated with ';'
|
||||||
|
// e.g:
|
||||||
|
//
|
||||||
|
// uses
|
||||||
|
// {
|
||||||
|
// Classes;
|
||||||
|
// SysUtils;
|
||||||
|
// }
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
uses
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This section is used for generating "const" clause in the unit 'svfLexer'.
|
||||||
|
// The content of the section is verbatim copied into the generated code.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
//const
|
||||||
|
//{
|
||||||
|
//}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This section is used for generating "type" clause in the unit 'svfLexer'.
|
||||||
|
// The content of the section is verbatim copied into the generated code.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
type
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Lexer class declaration
|
||||||
|
// ============================================================================
|
||||||
|
lexer TsvfLexer;
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Lexer options
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
options
|
||||||
|
{
|
||||||
|
k = 2;
|
||||||
|
exportVocab = jtag.svfLexer;
|
||||||
|
caseSensitive = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Lexer tokens. Usualy string literals.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
tokens
|
||||||
|
{
|
||||||
|
// ------------
|
||||||
|
// SVF Commands
|
||||||
|
// ------------
|
||||||
|
"ENDDR";
|
||||||
|
"ENDIR";
|
||||||
|
"FREQUENCY";
|
||||||
|
"HDR";
|
||||||
|
"HIR";
|
||||||
|
"PIO";
|
||||||
|
"PIOMAP";
|
||||||
|
"RUNTEST";
|
||||||
|
"SDR";
|
||||||
|
"SIR";
|
||||||
|
"STATE";
|
||||||
|
"TDR";
|
||||||
|
"TIR";
|
||||||
|
"TRST";
|
||||||
|
|
||||||
|
// ------------
|
||||||
|
// TAP States
|
||||||
|
// ------------
|
||||||
|
"RESET";
|
||||||
|
"IDLE";
|
||||||
|
|
||||||
|
"DRSELECT";
|
||||||
|
"DRCAPTURE";
|
||||||
|
"DRSHIFT";
|
||||||
|
"DRPAUSE";
|
||||||
|
"DREXIT1";
|
||||||
|
"DREXIT2";
|
||||||
|
"DRUPDATE";
|
||||||
|
|
||||||
|
"IRSELECT";
|
||||||
|
"IRCAPTURE";
|
||||||
|
"IRSHIFT";
|
||||||
|
"IRPAUSE";
|
||||||
|
"IREXIT1";
|
||||||
|
"IREXIT2";
|
||||||
|
"IRUPDATE";
|
||||||
|
|
||||||
|
"HZ";
|
||||||
|
"TDI";
|
||||||
|
"TDO";
|
||||||
|
"MASK";
|
||||||
|
"SMASK";
|
||||||
|
|
||||||
|
"IN";
|
||||||
|
"OUT";
|
||||||
|
"INOUT";
|
||||||
|
|
||||||
|
"SEC";
|
||||||
|
"MAXIMUM";
|
||||||
|
"ENDSTATE";
|
||||||
|
"TCK";
|
||||||
|
"SCK";
|
||||||
|
|
||||||
|
"ON";
|
||||||
|
"OFF";
|
||||||
|
"Z";
|
||||||
|
"ABSENT";
|
||||||
|
|
||||||
|
INT;
|
||||||
|
FLOAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Lexer member declarations.
|
||||||
|
// All user defined member declarations should be placed here.
|
||||||
|
// The content of the section is verbatim copied into the generated code.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
memberdecl
|
||||||
|
{
|
||||||
|
protected
|
||||||
|
fOnNewline : TNotifyEvent;
|
||||||
|
|
||||||
|
public
|
||||||
|
property OnNewline : TNotifyEvent read fOnNewline write fOnNewline;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Begin rule definitions
|
||||||
|
//
|
||||||
|
// Remember: All lexer rule names must begin with UPPERCASE letter!
|
||||||
|
// ============================================================================
|
||||||
|
SEMI : ';';
|
||||||
|
LPAREN : '(';
|
||||||
|
RPAREN : ')';
|
||||||
|
|
||||||
|
ID
|
||||||
|
options
|
||||||
|
{
|
||||||
|
testLiterals = true;
|
||||||
|
}
|
||||||
|
: ('A'..'Z' | 'a'..'z') ('A'..'Z' | 'a'..'z' | '0'..'9')*
|
||||||
|
;
|
||||||
|
|
||||||
|
NUMBER
|
||||||
|
:
|
||||||
|
DIGITS { _ttype := TT_INT; }
|
||||||
|
( '.' DIGITS { _ttype := TT_FLOAT;} )?
|
||||||
|
( EXP (SIGN)? DIGITS { _ttype := TT_FLOAT;} )?
|
||||||
|
;
|
||||||
|
|
||||||
|
protected
|
||||||
|
VECTOR
|
||||||
|
:
|
||||||
|
'H' | 'L' | 'Z' | 'U' | 'D' | 'X' |
|
||||||
|
'h' | 'l' | 'z' | 'u' | 'd' | 'x'
|
||||||
|
;
|
||||||
|
|
||||||
|
protected
|
||||||
|
EXP
|
||||||
|
: 'E' | 'e'
|
||||||
|
;
|
||||||
|
|
||||||
|
protected
|
||||||
|
SIGN
|
||||||
|
: '+' | '-'
|
||||||
|
;
|
||||||
|
|
||||||
|
protected DIGIT : '0'..'9';
|
||||||
|
protected DIGITS : (DIGIT)+ ;
|
||||||
|
|
||||||
|
//protected XDIGIT : 'a'..'f' | 'A'..'F' | '0'..'9';
|
||||||
|
//protected XDIGITS : (XDIGIT)+ ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// SLCOMMENT
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
SLCOMMENT
|
||||||
|
:
|
||||||
|
("//" | '!')
|
||||||
|
( ~( '\r' | '\n') )*
|
||||||
|
(
|
||||||
|
options
|
||||||
|
{
|
||||||
|
generateAmbigWarnings = false;
|
||||||
|
}
|
||||||
|
: '\r' '\n' { newLine; if Assigned( fOnNewline) then fOnNewline(self); }
|
||||||
|
| '\r' { newLine; if Assigned( fOnNewline) then fOnNewline(self); }
|
||||||
|
| '\n' { newLine; if Assigned( fOnNewline) then fOnNewline(self); }
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_ttype := TT_SKIP;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// NEWLINE
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
NEWLINE
|
||||||
|
:
|
||||||
|
(
|
||||||
|
options
|
||||||
|
{
|
||||||
|
generateAmbigWarnings = false;
|
||||||
|
}
|
||||||
|
: '\r' '\n' { newLine; if Assigned( fOnNewline) then fOnNewline(self); }
|
||||||
|
| '\r' { newLine; if Assigned( fOnNewline) then fOnNewline(self); }
|
||||||
|
| '\n' { newLine; if Assigned( fOnNewline) then fOnNewline(self); }
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_ttype := TT_SKIP;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// WHITESPACE
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
WHITESPACE
|
||||||
|
:
|
||||||
|
(
|
||||||
|
' '
|
||||||
|
| '\t' { tab; }
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_ttype := TT_SKIP;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// End rule definitions
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This section is used for generating member defintions in the unit 'svfLexer'.
|
||||||
|
// The content of the section is verbatim copied into the generated code.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
memberdef
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,785 @@
|
|||||||
|
// ============================================================================
|
||||||
|
// This file is generated by the Delphi Parser Generator.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// DPG version: 2.1.0.0r
|
||||||
|
// Grammar: jtag.svfLexer.g
|
||||||
|
// ============================================================================
|
||||||
|
unit jtag.svfLexer;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
System.Classes,
|
||||||
|
dpgrtl.lexer,
|
||||||
|
dpgrtl.types,
|
||||||
|
jtag.svfLexerTokens,
|
||||||
|
SysUtils;
|
||||||
|
|
||||||
|
type
|
||||||
|
// =========================================================================
|
||||||
|
// Type declarations from grammar.
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Class TsvfLexer declaration
|
||||||
|
// =========================================================================
|
||||||
|
TsvfLexer = class( TLexer)
|
||||||
|
|
||||||
|
protected
|
||||||
|
fOnNewline : TNotifyEvent;
|
||||||
|
|
||||||
|
public
|
||||||
|
property OnNewline : TNotifyEvent read fOnNewline write fOnNewline;
|
||||||
|
|
||||||
|
protected // Internals
|
||||||
|
procedure initialize; override;
|
||||||
|
|
||||||
|
public // Protected grammar rules
|
||||||
|
// Must callable from parser too
|
||||||
|
procedure mDIGITS ( pCreate: boolean);
|
||||||
|
procedure mEXP ( pCreate: boolean);
|
||||||
|
procedure mSIGN ( pCreate: boolean);
|
||||||
|
procedure mVECTOR ( pCreate: boolean);
|
||||||
|
procedure mDIGIT ( pCreate: boolean);
|
||||||
|
|
||||||
|
public // Public grammar rules
|
||||||
|
procedure mSEMI ( pCreate: boolean);
|
||||||
|
procedure mLPAREN ( pCreate: boolean);
|
||||||
|
procedure mRPAREN ( pCreate: boolean);
|
||||||
|
procedure mID ( pCreate: boolean);
|
||||||
|
procedure mNUMBER ( pCreate: boolean);
|
||||||
|
procedure mSLCOMMENT ( pCreate: boolean);
|
||||||
|
procedure mNEWLINE ( pCreate: boolean);
|
||||||
|
procedure mWHITESPACE ( pCreate: boolean);
|
||||||
|
|
||||||
|
public
|
||||||
|
function NextToken: IToken; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
dpgrtl.exception,
|
||||||
|
dpgrtl.token;
|
||||||
|
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mSEMI
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mSEMI( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_SEMI;
|
||||||
|
|
||||||
|
match(';');
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mLPAREN
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mLPAREN( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_LPAREN;
|
||||||
|
|
||||||
|
match('(');
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mRPAREN
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mRPAREN( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_RPAREN;
|
||||||
|
|
||||||
|
match(')');
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mID
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mID( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_ID;
|
||||||
|
|
||||||
|
if (( LA(1) in ['A'..'Z'])) then
|
||||||
|
begin
|
||||||
|
match( ['A'..'Z']);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['a'..'z'])) then
|
||||||
|
begin
|
||||||
|
match( ['a'..'z']);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), ['A'..'Z','a'..'z'], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
|
||||||
|
while(true) do
|
||||||
|
begin
|
||||||
|
if (( LA(1) in ['A'..'Z'])) then
|
||||||
|
begin
|
||||||
|
match( ['A'..'Z']);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['a'..'z'])) then
|
||||||
|
begin
|
||||||
|
match( ['a'..'z']);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['0'..'9'])) then
|
||||||
|
begin
|
||||||
|
match( ['0'..'9']);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
_ttype := TestLiteral( _ttype);
|
||||||
|
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mNUMBER
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mNUMBER( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_NUMBER;
|
||||||
|
|
||||||
|
mDIGITS(false);
|
||||||
|
_ttype := TT_INT;
|
||||||
|
if (( LA(1) in ['.'])) then
|
||||||
|
begin
|
||||||
|
match('.');
|
||||||
|
mDIGITS(false);
|
||||||
|
_ttype := TT_FLOAT;
|
||||||
|
end;
|
||||||
|
if (( LA(1) in ['E','e'])) then
|
||||||
|
begin
|
||||||
|
mEXP(false);
|
||||||
|
if (( LA(1) in ['+','-'])) then
|
||||||
|
begin
|
||||||
|
mSIGN(false);
|
||||||
|
end;
|
||||||
|
mDIGITS(false);
|
||||||
|
_ttype := TT_FLOAT;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mDIGITS
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mDIGITS( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_cnt_18: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_DIGITS;
|
||||||
|
|
||||||
|
_cnt_18 := 0;
|
||||||
|
|
||||||
|
while(true) do
|
||||||
|
begin
|
||||||
|
if (( LA(1) in ['0'..'9'])) then
|
||||||
|
begin
|
||||||
|
mDIGIT(false);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if _cnt_18 >= 1 then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), ['0'..'9'], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
end;
|
||||||
|
|
||||||
|
INC(_cnt_18);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mEXP
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mEXP( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_EXP;
|
||||||
|
|
||||||
|
if (( LA(1) in ['E'])) then
|
||||||
|
begin
|
||||||
|
match('E');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['e'])) then
|
||||||
|
begin
|
||||||
|
match('e');
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), ['E','e'], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mSIGN
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mSIGN( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_SIGN;
|
||||||
|
|
||||||
|
if (( LA(1) in ['+'])) then
|
||||||
|
begin
|
||||||
|
match('+');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['-'])) then
|
||||||
|
begin
|
||||||
|
match('-');
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), ['+','-'], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mVECTOR
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mVECTOR( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_VECTOR;
|
||||||
|
|
||||||
|
if (( LA(1) in ['H'])) then
|
||||||
|
begin
|
||||||
|
match('H');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['L'])) then
|
||||||
|
begin
|
||||||
|
match('L');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['Z'])) then
|
||||||
|
begin
|
||||||
|
match('Z');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['U'])) then
|
||||||
|
begin
|
||||||
|
match('U');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['D'])) then
|
||||||
|
begin
|
||||||
|
match('D');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['X'])) then
|
||||||
|
begin
|
||||||
|
match('X');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['h'])) then
|
||||||
|
begin
|
||||||
|
match('h');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['l'])) then
|
||||||
|
begin
|
||||||
|
match('l');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['z'])) then
|
||||||
|
begin
|
||||||
|
match('z');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['u'])) then
|
||||||
|
begin
|
||||||
|
match('u');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['d'])) then
|
||||||
|
begin
|
||||||
|
match('d');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['x'])) then
|
||||||
|
begin
|
||||||
|
match('x');
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), ['D','H','L','U','X','Z','d','h','l','u','x','z'], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mDIGIT
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mDIGIT( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_DIGIT;
|
||||||
|
|
||||||
|
match( ['0'..'9']);
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mSLCOMMENT
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mSLCOMMENT( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_SLCOMMENT;
|
||||||
|
|
||||||
|
if (( LA(1) in ['/'])) then
|
||||||
|
begin
|
||||||
|
match('//');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['!'])) then
|
||||||
|
begin
|
||||||
|
match('!');
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), ['!','/'], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
|
||||||
|
while(true) do
|
||||||
|
begin
|
||||||
|
if (( LA(1) in [#1..#9,#11..#12,#14..#255])) then
|
||||||
|
begin
|
||||||
|
match( [#1..#9,#11..#12,#14..#255]);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (( LA(1) in [#13]) and (LA(2) in [#10])) then
|
||||||
|
begin
|
||||||
|
match(#13);
|
||||||
|
match(#10);
|
||||||
|
newLine; if Assigned( fOnNewline) then fOnNewline(self);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#13])) then
|
||||||
|
begin
|
||||||
|
match(#13);
|
||||||
|
newLine; if Assigned( fOnNewline) then fOnNewline(self);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#10])) then
|
||||||
|
begin
|
||||||
|
match(#10);
|
||||||
|
newLine; if Assigned( fOnNewline) then fOnNewline(self);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), [#10,#13], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
_ttype := TT_SKIP;
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mNEWLINE
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mNEWLINE( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_NEWLINE;
|
||||||
|
|
||||||
|
if (( LA(1) in [#13]) and (LA(2) in [#10])) then
|
||||||
|
begin
|
||||||
|
match(#13);
|
||||||
|
match(#10);
|
||||||
|
newLine; if Assigned( fOnNewline) then fOnNewline(self);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#13])) then
|
||||||
|
begin
|
||||||
|
match(#13);
|
||||||
|
newLine; if Assigned( fOnNewline) then fOnNewline(self);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#10])) then
|
||||||
|
begin
|
||||||
|
match(#10);
|
||||||
|
newLine; if Assigned( fOnNewline) then fOnNewline(self);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), [#10,#13], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
_ttype := TT_SKIP;
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mWHITESPACE
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfLexer.mWHITESPACE( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_WHITESPACE;
|
||||||
|
|
||||||
|
if (( LA(1) in [' '])) then
|
||||||
|
begin
|
||||||
|
match(' ');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#9])) then
|
||||||
|
begin
|
||||||
|
match(#9);
|
||||||
|
tab;
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), [#9,' '], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
_ttype := TT_SKIP;
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// NextToken
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
function TsvfLexer.NextToken : IToken;
|
||||||
|
var
|
||||||
|
_first : TCharSet;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_first := [#9..#10,#13,' '..'!','('..')','/'..'9',';','A'..'Z','a'..'z'];
|
||||||
|
|
||||||
|
while( true) do
|
||||||
|
begin
|
||||||
|
ResetText;
|
||||||
|
|
||||||
|
try
|
||||||
|
if (( LA(1) in [';'])) then
|
||||||
|
begin
|
||||||
|
mSEMI(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['('])) then
|
||||||
|
begin
|
||||||
|
mLPAREN(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [')'])) then
|
||||||
|
begin
|
||||||
|
mRPAREN(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['A'..'Z','a'..'z'])) then
|
||||||
|
begin
|
||||||
|
mID(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['0'..'9'])) then
|
||||||
|
begin
|
||||||
|
mNUMBER(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['!','/'])) then
|
||||||
|
begin
|
||||||
|
mSLCOMMENT(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#10,#13])) then
|
||||||
|
begin
|
||||||
|
mNEWLINE(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#9,' '])) then
|
||||||
|
begin
|
||||||
|
mWHITESPACE(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if LA(1) = EOF_CHAR then
|
||||||
|
begin
|
||||||
|
uponEof;
|
||||||
|
result := TToken.Create(TT_EOF);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create(LA(1), _first, InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// --------------------------------------------------------------
|
||||||
|
// If we found a SKIP token, then try again...
|
||||||
|
// --------------------------------------------------------------
|
||||||
|
if result = nil then
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// --------------------------------------------------------------
|
||||||
|
// Now we have a valid token, so exit the function
|
||||||
|
// --------------------------------------------------------------
|
||||||
|
break;
|
||||||
|
|
||||||
|
except
|
||||||
|
Raise;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// InitLiterals
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
procedure TsvfLexer.initialize;
|
||||||
|
begin
|
||||||
|
fCaseSensitive := false;
|
||||||
|
fLiterals.CaseSensitive := false;
|
||||||
|
|
||||||
|
fLiterals['drselect' ] := 20;
|
||||||
|
fLiterals['pio' ] := 9;
|
||||||
|
fLiterals['mask' ] := 37;
|
||||||
|
fLiterals['absent' ] := 50;
|
||||||
|
fLiterals['idle' ] := 19;
|
||||||
|
fLiterals['drupdate' ] := 26;
|
||||||
|
fLiterals['tdo' ] := 36;
|
||||||
|
fLiterals['hdr' ] := 7;
|
||||||
|
fLiterals['ircapture' ] := 28;
|
||||||
|
fLiterals['enddr' ] := 4;
|
||||||
|
fLiterals['out' ] := 40;
|
||||||
|
fLiterals['drpause' ] := 23;
|
||||||
|
fLiterals['off' ] := 48;
|
||||||
|
fLiterals['tir' ] := 16;
|
||||||
|
fLiterals['drexit2' ] := 25;
|
||||||
|
fLiterals['irupdate' ] := 33;
|
||||||
|
fLiterals['tdr' ] := 15;
|
||||||
|
fLiterals['on' ] := 47;
|
||||||
|
fLiterals['inout' ] := 41;
|
||||||
|
fLiterals['sdr' ] := 12;
|
||||||
|
fLiterals['irexit1' ] := 31;
|
||||||
|
fLiterals['state' ] := 14;
|
||||||
|
fLiterals['drexit1' ] := 24;
|
||||||
|
fLiterals['irpause' ] := 30;
|
||||||
|
fLiterals['endir' ] := 5;
|
||||||
|
fLiterals['drshift' ] := 22;
|
||||||
|
fLiterals['maximum' ] := 43;
|
||||||
|
fLiterals['tdi' ] := 35;
|
||||||
|
fLiterals['frequency' ] := 6;
|
||||||
|
fLiterals['hir' ] := 8;
|
||||||
|
fLiterals['hz' ] := 34;
|
||||||
|
fLiterals['runtest' ] := 11;
|
||||||
|
fLiterals['smask' ] := 38;
|
||||||
|
fLiterals['in' ] := 39;
|
||||||
|
fLiterals['tck' ] := 45;
|
||||||
|
fLiterals['z' ] := 49;
|
||||||
|
fLiterals['reset' ] := 18;
|
||||||
|
fLiterals['sck' ] := 46;
|
||||||
|
fLiterals['sir' ] := 13;
|
||||||
|
fLiterals['irselect' ] := 27;
|
||||||
|
fLiterals['trst' ] := 17;
|
||||||
|
fLiterals['irshift' ] := 29;
|
||||||
|
fLiterals['irexit2' ] := 32;
|
||||||
|
fLiterals['endstate' ] := 44;
|
||||||
|
fLiterals['drcapture' ] := 21;
|
||||||
|
fLiterals['piomap' ] := 10;
|
||||||
|
fLiterals['sec' ] := 42;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
// ============================================================================
|
||||||
|
// This file is generated by the Delphi Parser Generator.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// DPG version: 2.1.0.0r
|
||||||
|
// Grammar: jtag.svfLexer.g
|
||||||
|
// ============================================================================
|
||||||
|
unit jtag.svfLexerTokens;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
const
|
||||||
|
LT_DRSELECT = 20;
|
||||||
|
LT_PIO = 9;
|
||||||
|
LT_MASK = 37;
|
||||||
|
LT_ABSENT = 50;
|
||||||
|
TT_ID = 56;
|
||||||
|
TT_NEWLINE = 64;
|
||||||
|
TT_EOF = 1;
|
||||||
|
TT_SEMI = 53;
|
||||||
|
TT_DIGIT = 61;
|
||||||
|
LT_IDLE = 19;
|
||||||
|
LT_DRUPDATE = 26;
|
||||||
|
LT_TDO = 36;
|
||||||
|
LT_HDR = 7;
|
||||||
|
LT_IRCAPTURE = 28;
|
||||||
|
LT_ENDDR = 4;
|
||||||
|
LT_OUT = 40;
|
||||||
|
LT_DRPAUSE = 23;
|
||||||
|
LT_OFF = 48;
|
||||||
|
LT_TIR = 16;
|
||||||
|
LT_DREXIT2 = 25;
|
||||||
|
TT_SIGN = 60;
|
||||||
|
LT_IRUPDATE = 33;
|
||||||
|
LT_TDR = 15;
|
||||||
|
TT_RPAREN = 55;
|
||||||
|
LT_ON = 47;
|
||||||
|
LT_INOUT = 41;
|
||||||
|
LT_SDR = 12;
|
||||||
|
LT_IREXIT1 = 31;
|
||||||
|
LT_STATE = 14;
|
||||||
|
TT_DIGITS = 62;
|
||||||
|
LT_DREXIT1 = 24;
|
||||||
|
LT_IRPAUSE = 30;
|
||||||
|
TT_SLCOMMENT = 63;
|
||||||
|
LT_ENDIR = 5;
|
||||||
|
LT_DRSHIFT = 22;
|
||||||
|
LT_MAXIMUM = 43;
|
||||||
|
LT_TDI = 35;
|
||||||
|
LT_FREQUENCY = 6;
|
||||||
|
LT_HIR = 8;
|
||||||
|
LT_HZ = 34;
|
||||||
|
LT_RUNTEST = 11;
|
||||||
|
LT_SMASK = 38;
|
||||||
|
LT_IN = 39;
|
||||||
|
LT_TCK = 45;
|
||||||
|
LT_Z = 49;
|
||||||
|
LT_RESET = 18;
|
||||||
|
TT_INT = 51;
|
||||||
|
LT_SCK = 46;
|
||||||
|
TT_FLOAT = 52;
|
||||||
|
TT_VECTOR = 58;
|
||||||
|
LT_SIR = 13;
|
||||||
|
TT_EXP = 59;
|
||||||
|
LT_IRSELECT = 27;
|
||||||
|
LT_TRST = 17;
|
||||||
|
LT_IRSHIFT = 29;
|
||||||
|
TT_LPAREN = 54;
|
||||||
|
TT_NUMBER = 57;
|
||||||
|
LT_IREXIT2 = 32;
|
||||||
|
TT_WHITESPACE = 65;
|
||||||
|
LT_ENDSTATE = 44;
|
||||||
|
LT_DRCAPTURE = 21;
|
||||||
|
LT_PIOMAP = 10;
|
||||||
|
LT_SEC = 42;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
end.
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
// $Delphi Parser Generator: jtag.svfLexer.g -> jtag.svfLexer.gTokens.txt$
|
||||||
|
TsvfLexer
|
||||||
|
LT_DRSELECT="DRSELECT"=20
|
||||||
|
LT_PIO="PIO"=9
|
||||||
|
LT_MASK="MASK"=37
|
||||||
|
LT_ABSENT="ABSENT"=50
|
||||||
|
TT_ID=56
|
||||||
|
TT_NEWLINE=64
|
||||||
|
TT_EOF=1
|
||||||
|
TT_SEMI=53
|
||||||
|
TT_DIGIT=61
|
||||||
|
LT_IDLE="IDLE"=19
|
||||||
|
LT_DRUPDATE="DRUPDATE"=26
|
||||||
|
LT_TDO="TDO"=36
|
||||||
|
LT_HDR="HDR"=7
|
||||||
|
LT_IRCAPTURE="IRCAPTURE"=28
|
||||||
|
LT_ENDDR="ENDDR"=4
|
||||||
|
LT_OUT="OUT"=40
|
||||||
|
LT_DRPAUSE="DRPAUSE"=23
|
||||||
|
LT_OFF="OFF"=48
|
||||||
|
LT_TIR="TIR"=16
|
||||||
|
LT_DREXIT2="DREXIT2"=25
|
||||||
|
TT_SIGN=60
|
||||||
|
LT_IRUPDATE="IRUPDATE"=33
|
||||||
|
LT_TDR="TDR"=15
|
||||||
|
TT_RPAREN=55
|
||||||
|
LT_ON="ON"=47
|
||||||
|
LT_INOUT="INOUT"=41
|
||||||
|
LT_SDR="SDR"=12
|
||||||
|
LT_IREXIT1="IREXIT1"=31
|
||||||
|
LT_STATE="STATE"=14
|
||||||
|
TT_DIGITS=62
|
||||||
|
LT_DREXIT1="DREXIT1"=24
|
||||||
|
LT_IRPAUSE="IRPAUSE"=30
|
||||||
|
TT_SLCOMMENT=63
|
||||||
|
LT_ENDIR="ENDIR"=5
|
||||||
|
LT_DRSHIFT="DRSHIFT"=22
|
||||||
|
LT_MAXIMUM="MAXIMUM"=43
|
||||||
|
LT_TDI="TDI"=35
|
||||||
|
LT_FREQUENCY="FREQUENCY"=6
|
||||||
|
LT_HIR="HIR"=8
|
||||||
|
LT_HZ="HZ"=34
|
||||||
|
LT_RUNTEST="RUNTEST"=11
|
||||||
|
LT_SMASK="SMASK"=38
|
||||||
|
LT_IN="IN"=39
|
||||||
|
LT_TCK="TCK"=45
|
||||||
|
LT_Z="Z"=49
|
||||||
|
LT_RESET="RESET"=18
|
||||||
|
TT_INT=51
|
||||||
|
LT_SCK="SCK"=46
|
||||||
|
TT_FLOAT=52
|
||||||
|
TT_VECTOR=58
|
||||||
|
LT_SIR="SIR"=13
|
||||||
|
TT_EXP=59
|
||||||
|
LT_IRSELECT="IRSELECT"=27
|
||||||
|
LT_TRST="TRST"=17
|
||||||
|
LT_IRSHIFT="IRSHIFT"=29
|
||||||
|
TT_LPAREN=54
|
||||||
|
TT_NUMBER=57
|
||||||
|
LT_IREXIT2="IREXIT2"=32
|
||||||
|
TT_WHITESPACE=65
|
||||||
|
LT_ENDSTATE="ENDSTATE"=44
|
||||||
|
LT_DRCAPTURE="DRCAPTURE"=21
|
||||||
|
LT_PIOMAP="PIOMAP"=10
|
||||||
|
LT_SEC="SEC"=42
|
||||||
@@ -0,0 +1,376 @@
|
|||||||
|
unit jtag.svfParser;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This section is used for generating "uses" clause in the unit 'svfParser'.
|
||||||
|
// Every unit name must be terminated with ';'
|
||||||
|
// e.g:
|
||||||
|
//
|
||||||
|
// uses
|
||||||
|
// {
|
||||||
|
// Classes;
|
||||||
|
// SysUtils;
|
||||||
|
// }
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
uses
|
||||||
|
{
|
||||||
|
jtag.svfScanLexer;
|
||||||
|
|
||||||
|
jtag.svfProgram;
|
||||||
|
jtag.svfAstNode;
|
||||||
|
jtag.svfAstEndDR;
|
||||||
|
jtag.svfAstEndIR;
|
||||||
|
jtag.svfAstState;
|
||||||
|
jtag.svfAstScan;
|
||||||
|
jtag.svfAstRuntest;
|
||||||
|
|
||||||
|
dpgrtl.tokenbuffer;
|
||||||
|
dpgrtl.parserstate;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This section is used for generating "const" clause in the unit 'svfParser'.
|
||||||
|
// The content of the section is verbatim copied into the generated code.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
//const
|
||||||
|
//{
|
||||||
|
//}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This section is used for generating "type" clause in the unit 'svfParser'.
|
||||||
|
// The content of the section is verbatim copied into the generated code.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
type
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Parser class declaration
|
||||||
|
// ============================================================================
|
||||||
|
parser TsvfParser;
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Parser options
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
options
|
||||||
|
{
|
||||||
|
k = 2;
|
||||||
|
importVocab = jtag.svfScanLexer;
|
||||||
|
exportVocab = jtag.svfParser;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Parser member declarations.
|
||||||
|
// All user defined member declarations should be placed here.
|
||||||
|
// The content of the section is verbatim copied into the generated code.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
memberdecl
|
||||||
|
{
|
||||||
|
protected
|
||||||
|
fProgram : TsvfProgram;
|
||||||
|
|
||||||
|
fScanLexer : TsvfScanLexer;
|
||||||
|
fOldPS : IParserState;
|
||||||
|
fNewPS : IParserState;
|
||||||
|
|
||||||
|
public
|
||||||
|
procedure AfterConstruction; override;
|
||||||
|
procedure BeforeDestruction; override;
|
||||||
|
|
||||||
|
protected
|
||||||
|
procedure AddENDDR( Value : byte);
|
||||||
|
procedure AddENDIR( Value : byte);
|
||||||
|
procedure AddFREQ( t : IToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Begin rule definitions
|
||||||
|
//
|
||||||
|
// Remember: All parser rule names must begin with LOWERCASE letter!
|
||||||
|
// ============================================================================
|
||||||
|
svf[scan: TsvfScanLexer] returns [TsvfProgram]
|
||||||
|
local
|
||||||
|
{
|
||||||
|
ntb : ITokenBuffer;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
fScanLexer := scan;
|
||||||
|
|
||||||
|
ntb := TTokenBuffer.Create( fScanLexer);
|
||||||
|
fOldPS := InputState;
|
||||||
|
fNewPS := TParserState.Create( ntb);
|
||||||
|
}
|
||||||
|
:
|
||||||
|
(command SEMI)*
|
||||||
|
|
||||||
|
{
|
||||||
|
result := fProgram;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
command
|
||||||
|
local
|
||||||
|
{
|
||||||
|
xstate : byte;
|
||||||
|
sstate : byte;
|
||||||
|
trst : AnsiString;
|
||||||
|
s : AnsiString;
|
||||||
|
astScan : TsvfAstScan;
|
||||||
|
astState : TsvfAstState;
|
||||||
|
astRun : TsvfAstRuntest;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
xstate := stNONDEF; // intermediate state
|
||||||
|
sstate := stNONDEF; // stable state
|
||||||
|
trst := '';
|
||||||
|
|
||||||
|
t := nil;
|
||||||
|
n := nil;
|
||||||
|
}
|
||||||
|
:
|
||||||
|
"ENDDR" sstate=stable_state { AddENDDR( sstate); }
|
||||||
|
| "ENDIR" sstate=stable_state { AddENDIR( sstate); }
|
||||||
|
|
||||||
|
|
||||||
|
| (t:"HDR" | t:"HIR" | t:"TDR" | t:"TIR" | t:"SDR" | t:"SIR" ) n:INT
|
||||||
|
{
|
||||||
|
astScan := TsvfAstScan.Create( t.TokenText, n.TokenText);
|
||||||
|
}
|
||||||
|
(
|
||||||
|
("TDI" scandata[0,astScan])
|
||||||
|
| ("TDO" scandata[1,astScan])
|
||||||
|
| ("MASK" scandata[2,astScan])
|
||||||
|
| ("SMASK" scandata[3,astScan])
|
||||||
|
)*
|
||||||
|
|
||||||
|
{
|
||||||
|
fProgram.AddStatement( astScan);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------
|
||||||
|
// STATE
|
||||||
|
// -----------------------------------------------------
|
||||||
|
| "STATE"
|
||||||
|
{
|
||||||
|
astState := TsvfAstState.Create;
|
||||||
|
astState.BeginData;
|
||||||
|
}
|
||||||
|
|
||||||
|
(
|
||||||
|
xstate=state
|
||||||
|
{
|
||||||
|
astState.AddState( xstate);
|
||||||
|
}
|
||||||
|
)*
|
||||||
|
|
||||||
|
sstate=stable_state
|
||||||
|
{
|
||||||
|
astState.AddState( sstate);
|
||||||
|
astState.EndData;
|
||||||
|
|
||||||
|
fProgram.AddStatement( astState);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// RUNTEST
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
| "RUNTEST"
|
||||||
|
{
|
||||||
|
astRun := TsvfAstRuntest.Create;
|
||||||
|
astRun.BeginData;
|
||||||
|
}
|
||||||
|
|
||||||
|
(
|
||||||
|
sstate=stable_state
|
||||||
|
{
|
||||||
|
astRun.RunState := sstate;
|
||||||
|
}
|
||||||
|
)?
|
||||||
|
|
||||||
|
(
|
||||||
|
t:INT s=run_clk
|
||||||
|
{
|
||||||
|
astRun.RunCount := t.Tokentext;
|
||||||
|
astRun.RunClock := s;
|
||||||
|
}
|
||||||
|
|
||||||
|
(
|
||||||
|
(t:INT | t:FLOAT) "SEC"
|
||||||
|
{
|
||||||
|
astRun.MinTime := t.TokenText;
|
||||||
|
}
|
||||||
|
(
|
||||||
|
"MAXIMUM" t:INT "SEC"
|
||||||
|
{
|
||||||
|
astRun.MaxTime := t.Tokentext;
|
||||||
|
}
|
||||||
|
)?
|
||||||
|
)?
|
||||||
|
|
||||||
|
|
|
||||||
|
(t:INT | t:FLOAT) "SEC"
|
||||||
|
{
|
||||||
|
astRun.MinTime := t.TokenText;
|
||||||
|
}
|
||||||
|
(
|
||||||
|
"MAXIMUM" t:INT "SEC"
|
||||||
|
{
|
||||||
|
astRun.MaxTime := t.Tokentext;
|
||||||
|
}
|
||||||
|
)?
|
||||||
|
)
|
||||||
|
|
||||||
|
(
|
||||||
|
"ENDSTATE" sstate=stable_state
|
||||||
|
{
|
||||||
|
astRun.EndState := sstate;
|
||||||
|
}
|
||||||
|
)?
|
||||||
|
|
||||||
|
{
|
||||||
|
astRun.EndData;
|
||||||
|
fProgram.AddStatement( astRun);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------
|
||||||
|
// Not implemented commands...
|
||||||
|
// ---------------------------
|
||||||
|
| "TRST" trst=trst_val
|
||||||
|
| "FREQUENCY" f:FLOAT "HZ"
|
||||||
|
| "PIO" VECTOR
|
||||||
|
| "PIOMAP" LPAREN (direction ID)+ RPAREN
|
||||||
|
;
|
||||||
|
|
||||||
|
run_clk returns [AnsiString]
|
||||||
|
:
|
||||||
|
"TCK" { result := 'TCK'; }
|
||||||
|
| "SCK" { result := 'SCK'; }
|
||||||
|
;
|
||||||
|
|
||||||
|
trst_val returns [AnsiString]
|
||||||
|
:
|
||||||
|
"ON" { result := 'ON'; }
|
||||||
|
| "OFF" { result := 'OFF'; }
|
||||||
|
| "Z" { result := 'Z'; }
|
||||||
|
| "ABSENT" { result := 'ABSENT'; }
|
||||||
|
;
|
||||||
|
|
||||||
|
state returns [byte]
|
||||||
|
:
|
||||||
|
"RESET" { result := stRESET; }
|
||||||
|
| "IDLE" { result := stIDLE; }
|
||||||
|
|
||||||
|
| "DRSELECT" { result := stDRSELECT; }
|
||||||
|
| "DRCAPTURE" { result := stDRCAPTURE; }
|
||||||
|
| "DRSHIFT" { result := stDRSHIFT; }
|
||||||
|
| "DRPAUSE" { result := stDRPAUSE; }
|
||||||
|
| "DREXIT1" { result := stDREXIT1; }
|
||||||
|
| "DREXIT2" { result := stDREXIT2; }
|
||||||
|
| "DRUPDATE" { result := stDRUPDATE; }
|
||||||
|
|
||||||
|
| "IRSELECT" { result := stIRSELECT; }
|
||||||
|
| "IRCAPTURE" { result := stIRCAPTURE; }
|
||||||
|
| "IRSHIFT" { result := stIRSHIFT; }
|
||||||
|
| "IRPAUSE" { result := stIRPAUSE; }
|
||||||
|
| "IREXIT1" { result := stIREXIT1; }
|
||||||
|
| "IREXIT2" { result := stIREXIT2; }
|
||||||
|
| "IRUPDATE" { result := stIRUPDATE; }
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
stable_state returns [byte]
|
||||||
|
:
|
||||||
|
"RESET" { result := stRESET; }
|
||||||
|
| "IDLE" { result := stIDLE; }
|
||||||
|
| "DRPAUSE" { result := stDRPAUSE; }
|
||||||
|
| "IRPAUSE" { result := stIRPAUSE; }
|
||||||
|
;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// This is the tricky part... Use another lexer for scandata parsing.
|
||||||
|
// ============================================================================
|
||||||
|
scandata [idx: byte; scan: TsvfAstScan]
|
||||||
|
:
|
||||||
|
LPAREN
|
||||||
|
{
|
||||||
|
InputState := fNewPS;
|
||||||
|
scan.BeginData;
|
||||||
|
}
|
||||||
|
|
||||||
|
(
|
||||||
|
t:XDIGITS
|
||||||
|
{
|
||||||
|
case idx of
|
||||||
|
0: scan.AddTDI( t.TokenText);
|
||||||
|
1: scan.AddTDO( t.TokenText);
|
||||||
|
2: scan.AddMASK( t.TokenText);
|
||||||
|
3: scan.AddSMASK( t.TokenText);
|
||||||
|
end;
|
||||||
|
}
|
||||||
|
)+
|
||||||
|
|
||||||
|
RPAREN
|
||||||
|
{
|
||||||
|
scan.EndData;
|
||||||
|
InputState := fOldPS;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
direction
|
||||||
|
:
|
||||||
|
"IN" | "OUT" | "INOUT"
|
||||||
|
;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// End rule definitions
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This section is used for generating member defintions in the unit 'svfParser'.
|
||||||
|
// The content of the section is verbatim copied into the generated code.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
memberdef
|
||||||
|
{
|
||||||
|
// ============================================================================
|
||||||
|
// AfterConstruction
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.AfterConstruction;
|
||||||
|
begin
|
||||||
|
fProgram := TsvfProgram.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// BeforeDestruction
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.BeforeDestruction;
|
||||||
|
begin
|
||||||
|
fProgram.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// ENDDR
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.AddENDDR( Value: byte);
|
||||||
|
begin
|
||||||
|
fProgram.AddStatement( TsvfAstEndDR.Create( Value));
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// ENDIR
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.AddENDIR( Value: byte);
|
||||||
|
begin
|
||||||
|
fProgram.AddStatement( TsvfAstEndIR.Create( Value));
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// FREQUENCY
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.AddFREQ( t: IToken);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,688 @@
|
|||||||
|
// ============================================================================
|
||||||
|
// This file is generated by the Delphi Parser Generator.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// DPG version: 2.1.0.0r
|
||||||
|
// Grammar: jtag.svfParser.g
|
||||||
|
// ============================================================================
|
||||||
|
unit jtag.svfParser;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes,
|
||||||
|
dpgrtl.llkparser,
|
||||||
|
dpgrtl.parserstate,
|
||||||
|
dpgrtl.tokenbuffer,
|
||||||
|
dpgrtl.types,
|
||||||
|
jtag.svfAstEndDR,
|
||||||
|
jtag.svfAstEndIR,
|
||||||
|
jtag.svfAstNode,
|
||||||
|
jtag.svfAstRuntest,
|
||||||
|
jtag.svfAstScan,
|
||||||
|
jtag.svfAstState,
|
||||||
|
jtag.svfParserTokens,
|
||||||
|
jtag.svfProgram,
|
||||||
|
jtag.svfScanLexer,
|
||||||
|
SysUtils;
|
||||||
|
|
||||||
|
type
|
||||||
|
// =========================================================================
|
||||||
|
// Type declarations from grammar.
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Class TsvfParser declaration
|
||||||
|
// =========================================================================
|
||||||
|
TsvfParser = class( TLLkParser)
|
||||||
|
|
||||||
|
protected
|
||||||
|
fProgram : TsvfProgram;
|
||||||
|
|
||||||
|
fScanLexer : TsvfScanLexer;
|
||||||
|
fOldPS : IParserState;
|
||||||
|
fNewPS : IParserState;
|
||||||
|
|
||||||
|
public
|
||||||
|
procedure AfterConstruction; override;
|
||||||
|
procedure BeforeDestruction; override;
|
||||||
|
|
||||||
|
protected
|
||||||
|
procedure AddENDDR( Value : byte);
|
||||||
|
procedure AddENDIR( Value : byte);
|
||||||
|
procedure AddFREQ( t : IToken);
|
||||||
|
|
||||||
|
public // Public grammar rules
|
||||||
|
function svf ( scan: TsvfScanLexer): TsvfProgram;
|
||||||
|
procedure command ;
|
||||||
|
function stable_state : byte;
|
||||||
|
procedure scandata ( idx: byte; scan: TsvfAstScan);
|
||||||
|
function state : byte;
|
||||||
|
function run_clk : AnsiString;
|
||||||
|
function trst_val : AnsiString;
|
||||||
|
procedure direction ;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
dpgrtl.exception,
|
||||||
|
dpgrtl.token;
|
||||||
|
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// svf
|
||||||
|
// ============================================================================
|
||||||
|
function TsvfParser.svf( scan: TsvfScanLexer): TsvfProgram;
|
||||||
|
var
|
||||||
|
ntb : ITokenBuffer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
fScanLexer := scan;
|
||||||
|
|
||||||
|
ntb := TTokenBuffer.Create( fScanLexer);
|
||||||
|
fOldPS := InputState;
|
||||||
|
fNewPS := TParserState.Create( ntb);
|
||||||
|
|
||||||
|
|
||||||
|
while(true) do
|
||||||
|
begin
|
||||||
|
if (( LA(1) in [LT_ENDDR..LT_TRST])) then
|
||||||
|
begin
|
||||||
|
command;
|
||||||
|
match(TT_SEMI);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
result := fProgram;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// command
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.command;
|
||||||
|
var
|
||||||
|
_cnt_23: integer;
|
||||||
|
f: IToken;
|
||||||
|
n: IToken;
|
||||||
|
t: IToken;
|
||||||
|
xstate : byte;
|
||||||
|
sstate : byte;
|
||||||
|
trst : AnsiString;
|
||||||
|
s : AnsiString;
|
||||||
|
astScan : TsvfAstScan;
|
||||||
|
astState : TsvfAstState;
|
||||||
|
astRun : TsvfAstRuntest;
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
xstate := stNONDEF; // intermediate state
|
||||||
|
sstate := stNONDEF; // stable state
|
||||||
|
trst := '';
|
||||||
|
|
||||||
|
t := nil;
|
||||||
|
n := nil;
|
||||||
|
|
||||||
|
if (( LA(1) in [LT_ENDDR])) then
|
||||||
|
begin
|
||||||
|
match(LT_ENDDR);
|
||||||
|
sstate := stable_state;
|
||||||
|
AddENDDR( sstate);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_ENDIR])) then
|
||||||
|
begin
|
||||||
|
match(LT_ENDIR);
|
||||||
|
sstate := stable_state;
|
||||||
|
AddENDIR( sstate);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_HDR..LT_HIR,LT_SDR..LT_SIR,LT_TDR..LT_TIR])) then
|
||||||
|
begin
|
||||||
|
if (( LA(1) in [LT_HDR])) then
|
||||||
|
begin
|
||||||
|
t := LT(1);
|
||||||
|
match(LT_HDR);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_HIR])) then
|
||||||
|
begin
|
||||||
|
t := LT(1);
|
||||||
|
match(LT_HIR);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_TDR])) then
|
||||||
|
begin
|
||||||
|
t := LT(1);
|
||||||
|
match(LT_TDR);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_TIR])) then
|
||||||
|
begin
|
||||||
|
t := LT(1);
|
||||||
|
match(LT_TIR);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_SDR])) then
|
||||||
|
begin
|
||||||
|
t := LT(1);
|
||||||
|
match(LT_SDR);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_SIR])) then
|
||||||
|
begin
|
||||||
|
t := LT(1);
|
||||||
|
match(LT_SIR);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedToken.Create( LT(1), [LT_HDR..LT_HIR,LT_SDR..LT_SIR,LT_TDR..LT_TIR], InputState.FileName);
|
||||||
|
n := LT(1);
|
||||||
|
match(TT_INT);
|
||||||
|
astScan := TsvfAstScan.Create( t.TokenText, n.TokenText);
|
||||||
|
|
||||||
|
while(true) do
|
||||||
|
begin
|
||||||
|
if (( LA(1) in [LT_TDI])) then
|
||||||
|
begin
|
||||||
|
match(LT_TDI);
|
||||||
|
scandata(0,astScan);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_TDO])) then
|
||||||
|
begin
|
||||||
|
match(LT_TDO);
|
||||||
|
scandata(1,astScan);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_MASK])) then
|
||||||
|
begin
|
||||||
|
match(LT_MASK);
|
||||||
|
scandata(2,astScan);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_SMASK])) then
|
||||||
|
begin
|
||||||
|
match(LT_SMASK);
|
||||||
|
scandata(3,astScan);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
fProgram.AddStatement( astScan);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_STATE])) then
|
||||||
|
begin
|
||||||
|
match(LT_STATE);
|
||||||
|
astState := TsvfAstState.Create;
|
||||||
|
astState.BeginData;
|
||||||
|
|
||||||
|
while(true) do
|
||||||
|
begin
|
||||||
|
if (( LA(1) in [LT_RESET..LT_IRUPDATE]) and (LA(2) in [LT_RESET..LT_IRUPDATE])) then
|
||||||
|
begin
|
||||||
|
xstate := state;
|
||||||
|
astState.AddState( xstate);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
sstate := stable_state;
|
||||||
|
astState.AddState( sstate);
|
||||||
|
astState.EndData;
|
||||||
|
|
||||||
|
fProgram.AddStatement( astState);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_RUNTEST])) then
|
||||||
|
begin
|
||||||
|
match(LT_RUNTEST);
|
||||||
|
astRun := TsvfAstRuntest.Create;
|
||||||
|
astRun.BeginData;
|
||||||
|
if (( LA(1) in [LT_RESET..LT_IDLE,LT_DRPAUSE,LT_IRPAUSE])) then
|
||||||
|
begin
|
||||||
|
sstate := stable_state;
|
||||||
|
astRun.RunState := sstate;
|
||||||
|
end;
|
||||||
|
if (( LA(1) in [TT_INT]) and (LA(2) in [LT_TCK..LT_SCK])) then
|
||||||
|
begin
|
||||||
|
t := LT(1);
|
||||||
|
match(TT_INT);
|
||||||
|
s := run_clk;
|
||||||
|
astRun.RunCount := t.Tokentext;
|
||||||
|
astRun.RunClock := s;
|
||||||
|
if (( LA(1) in [TT_INT..TT_FLOAT])) then
|
||||||
|
begin
|
||||||
|
if (( LA(1) in [TT_INT])) then
|
||||||
|
begin
|
||||||
|
t := LT(1);
|
||||||
|
match(TT_INT);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [TT_FLOAT])) then
|
||||||
|
begin
|
||||||
|
t := LT(1);
|
||||||
|
match(TT_FLOAT);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedToken.Create( LT(1), [TT_INT..TT_FLOAT], InputState.FileName);
|
||||||
|
match(LT_SEC);
|
||||||
|
astRun.MinTime := t.TokenText;
|
||||||
|
if (( LA(1) in [LT_MAXIMUM])) then
|
||||||
|
begin
|
||||||
|
match(LT_MAXIMUM);
|
||||||
|
t := LT(1);
|
||||||
|
match(TT_INT);
|
||||||
|
match(LT_SEC);
|
||||||
|
astRun.MaxTime := t.Tokentext;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [TT_INT..TT_FLOAT]) and (LA(2) in [LT_SEC])) then
|
||||||
|
begin
|
||||||
|
if (( LA(1) in [TT_INT])) then
|
||||||
|
begin
|
||||||
|
t := LT(1);
|
||||||
|
match(TT_INT);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [TT_FLOAT])) then
|
||||||
|
begin
|
||||||
|
t := LT(1);
|
||||||
|
match(TT_FLOAT);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedToken.Create( LT(1), [TT_INT..TT_FLOAT], InputState.FileName);
|
||||||
|
match(LT_SEC);
|
||||||
|
astRun.MinTime := t.TokenText;
|
||||||
|
if (( LA(1) in [LT_MAXIMUM])) then
|
||||||
|
begin
|
||||||
|
match(LT_MAXIMUM);
|
||||||
|
t := LT(1);
|
||||||
|
match(TT_INT);
|
||||||
|
match(LT_SEC);
|
||||||
|
astRun.MaxTime := t.Tokentext;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedToken.Create( LT(1), [TT_INT..TT_FLOAT], InputState.FileName);
|
||||||
|
if (( LA(1) in [LT_ENDSTATE])) then
|
||||||
|
begin
|
||||||
|
match(LT_ENDSTATE);
|
||||||
|
sstate := stable_state;
|
||||||
|
astRun.EndState := sstate;
|
||||||
|
end;
|
||||||
|
astRun.EndData;
|
||||||
|
fProgram.AddStatement( astRun);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_TRST])) then
|
||||||
|
begin
|
||||||
|
match(LT_TRST);
|
||||||
|
trst := trst_val;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_FREQUENCY])) then
|
||||||
|
begin
|
||||||
|
match(LT_FREQUENCY);
|
||||||
|
f := LT(1);
|
||||||
|
match(TT_FLOAT);
|
||||||
|
match(LT_HZ);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_PIO])) then
|
||||||
|
begin
|
||||||
|
match(LT_PIO);
|
||||||
|
match(TT_VECTOR);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_PIOMAP])) then
|
||||||
|
begin
|
||||||
|
match(LT_PIOMAP);
|
||||||
|
match(TT_LPAREN);
|
||||||
|
_cnt_23 := 0;
|
||||||
|
|
||||||
|
while(true) do
|
||||||
|
begin
|
||||||
|
if (( LA(1) in [LT_IN..LT_INOUT])) then
|
||||||
|
begin
|
||||||
|
direction;
|
||||||
|
match(TT_ID);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if _cnt_23 >= 1 then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
Raise EMismatchedToken.Create( LT(1), [LT_IN..LT_INOUT], InputState.FileName);
|
||||||
|
end;
|
||||||
|
|
||||||
|
INC(_cnt_23);
|
||||||
|
end;
|
||||||
|
match(TT_RPAREN);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedToken.Create( LT(1), [LT_ENDDR..LT_TRST], InputState.FileName);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// stable_state
|
||||||
|
// ============================================================================
|
||||||
|
function TsvfParser.stable_state: byte;
|
||||||
|
begin
|
||||||
|
|
||||||
|
if (( LA(1) in [LT_RESET])) then
|
||||||
|
begin
|
||||||
|
match(LT_RESET);
|
||||||
|
result := stRESET;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_IDLE])) then
|
||||||
|
begin
|
||||||
|
match(LT_IDLE);
|
||||||
|
result := stIDLE;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_DRPAUSE])) then
|
||||||
|
begin
|
||||||
|
match(LT_DRPAUSE);
|
||||||
|
result := stDRPAUSE;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_IRPAUSE])) then
|
||||||
|
begin
|
||||||
|
match(LT_IRPAUSE);
|
||||||
|
result := stIRPAUSE;
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedToken.Create( LT(1), [LT_RESET..LT_IDLE,LT_DRPAUSE,LT_IRPAUSE], InputState.FileName);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// scandata
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.scandata( idx: byte; scan: TsvfAstScan);
|
||||||
|
var
|
||||||
|
_cnt_30: integer;
|
||||||
|
t: IToken;
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
match(TT_LPAREN);
|
||||||
|
InputState := fNewPS;
|
||||||
|
scan.BeginData;
|
||||||
|
_cnt_30 := 0;
|
||||||
|
|
||||||
|
while(true) do
|
||||||
|
begin
|
||||||
|
if (( LA(1) in [TT_XDIGITS])) then
|
||||||
|
begin
|
||||||
|
t := LT(1);
|
||||||
|
match(TT_XDIGITS);
|
||||||
|
case idx of
|
||||||
|
0: scan.AddTDI( t.TokenText);
|
||||||
|
1: scan.AddTDO( t.TokenText);
|
||||||
|
2: scan.AddMASK( t.TokenText);
|
||||||
|
3: scan.AddSMASK( t.TokenText);
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if _cnt_30 >= 1 then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
Raise EMismatchedToken.Create( LT(1), [TT_XDIGITS], InputState.FileName);
|
||||||
|
end;
|
||||||
|
|
||||||
|
INC(_cnt_30);
|
||||||
|
end;
|
||||||
|
match(TT_RPAREN);
|
||||||
|
scan.EndData;
|
||||||
|
InputState := fOldPS;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// state
|
||||||
|
// ============================================================================
|
||||||
|
function TsvfParser.state: byte;
|
||||||
|
begin
|
||||||
|
|
||||||
|
if (( LA(1) in [LT_RESET])) then
|
||||||
|
begin
|
||||||
|
match(LT_RESET);
|
||||||
|
result := stRESET;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_IDLE])) then
|
||||||
|
begin
|
||||||
|
match(LT_IDLE);
|
||||||
|
result := stIDLE;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_DRSELECT])) then
|
||||||
|
begin
|
||||||
|
match(LT_DRSELECT);
|
||||||
|
result := stDRSELECT;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_DRCAPTURE])) then
|
||||||
|
begin
|
||||||
|
match(LT_DRCAPTURE);
|
||||||
|
result := stDRCAPTURE;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_DRSHIFT])) then
|
||||||
|
begin
|
||||||
|
match(LT_DRSHIFT);
|
||||||
|
result := stDRSHIFT;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_DRPAUSE])) then
|
||||||
|
begin
|
||||||
|
match(LT_DRPAUSE);
|
||||||
|
result := stDRPAUSE;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_DREXIT1])) then
|
||||||
|
begin
|
||||||
|
match(LT_DREXIT1);
|
||||||
|
result := stDREXIT1;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_DREXIT2])) then
|
||||||
|
begin
|
||||||
|
match(LT_DREXIT2);
|
||||||
|
result := stDREXIT2;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_DRUPDATE])) then
|
||||||
|
begin
|
||||||
|
match(LT_DRUPDATE);
|
||||||
|
result := stDRUPDATE;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_IRSELECT])) then
|
||||||
|
begin
|
||||||
|
match(LT_IRSELECT);
|
||||||
|
result := stIRSELECT;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_IRCAPTURE])) then
|
||||||
|
begin
|
||||||
|
match(LT_IRCAPTURE);
|
||||||
|
result := stIRCAPTURE;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_IRSHIFT])) then
|
||||||
|
begin
|
||||||
|
match(LT_IRSHIFT);
|
||||||
|
result := stIRSHIFT;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_IRPAUSE])) then
|
||||||
|
begin
|
||||||
|
match(LT_IRPAUSE);
|
||||||
|
result := stIRPAUSE;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_IREXIT1])) then
|
||||||
|
begin
|
||||||
|
match(LT_IREXIT1);
|
||||||
|
result := stIREXIT1;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_IREXIT2])) then
|
||||||
|
begin
|
||||||
|
match(LT_IREXIT2);
|
||||||
|
result := stIREXIT2;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_IRUPDATE])) then
|
||||||
|
begin
|
||||||
|
match(LT_IRUPDATE);
|
||||||
|
result := stIRUPDATE;
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedToken.Create( LT(1), [LT_RESET..LT_IRUPDATE], InputState.FileName);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// run_clk
|
||||||
|
// ============================================================================
|
||||||
|
function TsvfParser.run_clk: AnsiString;
|
||||||
|
begin
|
||||||
|
|
||||||
|
if (( LA(1) in [LT_TCK])) then
|
||||||
|
begin
|
||||||
|
match(LT_TCK);
|
||||||
|
result := 'TCK';
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_SCK])) then
|
||||||
|
begin
|
||||||
|
match(LT_SCK);
|
||||||
|
result := 'SCK';
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedToken.Create( LT(1), [LT_TCK..LT_SCK], InputState.FileName);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// trst_val
|
||||||
|
// ============================================================================
|
||||||
|
function TsvfParser.trst_val: AnsiString;
|
||||||
|
begin
|
||||||
|
|
||||||
|
if (( LA(1) in [LT_ON])) then
|
||||||
|
begin
|
||||||
|
match(LT_ON);
|
||||||
|
result := 'ON';
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_OFF])) then
|
||||||
|
begin
|
||||||
|
match(LT_OFF);
|
||||||
|
result := 'OFF';
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_Z])) then
|
||||||
|
begin
|
||||||
|
match(LT_Z);
|
||||||
|
result := 'Z';
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_ABSENT])) then
|
||||||
|
begin
|
||||||
|
match(LT_ABSENT);
|
||||||
|
result := 'ABSENT';
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedToken.Create( LT(1), [LT_ON..LT_ABSENT], InputState.FileName);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// direction
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.direction;
|
||||||
|
begin
|
||||||
|
|
||||||
|
if (( LA(1) in [LT_IN])) then
|
||||||
|
begin
|
||||||
|
match(LT_IN);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_OUT])) then
|
||||||
|
begin
|
||||||
|
match(LT_OUT);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [LT_INOUT])) then
|
||||||
|
begin
|
||||||
|
match(LT_INOUT);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedToken.Create( LT(1), [LT_IN..LT_INOUT], InputState.FileName);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// AfterConstruction
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.AfterConstruction;
|
||||||
|
begin
|
||||||
|
fProgram := TsvfProgram.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// BeforeDestruction
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.BeforeDestruction;
|
||||||
|
begin
|
||||||
|
fProgram.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// ENDDR
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.AddENDDR( Value: byte);
|
||||||
|
begin
|
||||||
|
fProgram.AddStatement( TsvfAstEndDR.Create( Value));
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// ENDIR
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.AddENDIR( Value: byte);
|
||||||
|
begin
|
||||||
|
fProgram.AddStatement( TsvfAstEndIR.Create( Value));
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// FREQUENCY
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfParser.AddFREQ( t: IToken);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
end.
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
// ============================================================================
|
||||||
|
// This file is generated by the Delphi Parser Generator.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// DPG version: 2.1.0.0r
|
||||||
|
// Grammar: jtag.svfParser.g
|
||||||
|
// ============================================================================
|
||||||
|
unit jtag.svfParserTokens;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
const
|
||||||
|
LT_DRSELECT = 20;
|
||||||
|
LT_PIO = 9;
|
||||||
|
LT_MASK = 37;
|
||||||
|
LT_ABSENT = 50;
|
||||||
|
TT_ID = 56;
|
||||||
|
TT_NEWLINE = 64;
|
||||||
|
TT_EOF = 1;
|
||||||
|
TT_SEMI = 53;
|
||||||
|
TT_DIGIT = 61;
|
||||||
|
LT_TDO = 36;
|
||||||
|
LT_DRUPDATE = 26;
|
||||||
|
LT_OUT = 40;
|
||||||
|
LT_HDR = 7;
|
||||||
|
LT_OFF = 48;
|
||||||
|
LT_IRCAPTURE = 28;
|
||||||
|
LT_ENDDR = 4;
|
||||||
|
LT_DRPAUSE = 23;
|
||||||
|
LT_IDLE = 19;
|
||||||
|
TT_XDIGIT = 66;
|
||||||
|
LT_TIR = 16;
|
||||||
|
LT_DREXIT2 = 25;
|
||||||
|
TT_SIGN = 60;
|
||||||
|
LT_IRUPDATE = 33;
|
||||||
|
TT_RPAREN = 55;
|
||||||
|
LT_TDR = 15;
|
||||||
|
LT_ON = 47;
|
||||||
|
LT_INOUT = 41;
|
||||||
|
LT_SDR = 12;
|
||||||
|
LT_IREXIT1 = 31;
|
||||||
|
LT_STATE = 14;
|
||||||
|
TT_DIGITS = 62;
|
||||||
|
LT_DREXIT1 = 24;
|
||||||
|
LT_IRPAUSE = 30;
|
||||||
|
TT_SLCOMMENT = 63;
|
||||||
|
LT_ENDIR = 5;
|
||||||
|
LT_DRSHIFT = 22;
|
||||||
|
LT_MAXIMUM = 43;
|
||||||
|
LT_SMASK = 38;
|
||||||
|
LT_FREQUENCY = 6;
|
||||||
|
LT_TCK = 45;
|
||||||
|
LT_HZ = 34;
|
||||||
|
LT_RUNTEST = 11;
|
||||||
|
LT_HIR = 8;
|
||||||
|
LT_IN = 39;
|
||||||
|
TT_INT = 51;
|
||||||
|
LT_Z = 49;
|
||||||
|
LT_TDI = 35;
|
||||||
|
LT_RESET = 18;
|
||||||
|
LT_SCK = 46;
|
||||||
|
TT_VECTOR = 58;
|
||||||
|
TT_XDIGITS = 67;
|
||||||
|
LT_SIR = 13;
|
||||||
|
TT_EXP = 59;
|
||||||
|
LT_IRSELECT = 27;
|
||||||
|
LT_TRST = 17;
|
||||||
|
LT_IRSHIFT = 29;
|
||||||
|
TT_FLOAT = 52;
|
||||||
|
TT_LPAREN = 54;
|
||||||
|
TT_NUMBER = 57;
|
||||||
|
LT_IREXIT2 = 32;
|
||||||
|
TT_WHITESPACE = 65;
|
||||||
|
LT_ENDSTATE = 44;
|
||||||
|
LT_PIOMAP = 10;
|
||||||
|
LT_DRCAPTURE = 21;
|
||||||
|
LT_SEC = 42;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
end.
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
// $Delphi Parser Generator: jtag.svfParser.g -> jtag.svfParser.gTokens.txt$
|
||||||
|
TsvfParser
|
||||||
|
LT_DRSELECT="DRSELECT"=20
|
||||||
|
LT_PIO="PIO"=9
|
||||||
|
LT_MASK="MASK"=37
|
||||||
|
LT_ABSENT="ABSENT"=50
|
||||||
|
TT_ID=56
|
||||||
|
TT_NEWLINE=64
|
||||||
|
TT_EOF=1
|
||||||
|
TT_SEMI=53
|
||||||
|
TT_DIGIT=61
|
||||||
|
LT_TDO="TDO"=36
|
||||||
|
LT_DRUPDATE="DRUPDATE"=26
|
||||||
|
LT_OUT="OUT"=40
|
||||||
|
LT_HDR="HDR"=7
|
||||||
|
LT_OFF="OFF"=48
|
||||||
|
LT_IRCAPTURE="IRCAPTURE"=28
|
||||||
|
LT_ENDDR="ENDDR"=4
|
||||||
|
LT_DRPAUSE="DRPAUSE"=23
|
||||||
|
LT_IDLE="IDLE"=19
|
||||||
|
TT_XDIGIT=66
|
||||||
|
LT_TIR="TIR"=16
|
||||||
|
LT_DREXIT2="DREXIT2"=25
|
||||||
|
TT_SIGN=60
|
||||||
|
LT_IRUPDATE="IRUPDATE"=33
|
||||||
|
TT_RPAREN=55
|
||||||
|
LT_TDR="TDR"=15
|
||||||
|
LT_ON="ON"=47
|
||||||
|
LT_INOUT="INOUT"=41
|
||||||
|
LT_SDR="SDR"=12
|
||||||
|
LT_IREXIT1="IREXIT1"=31
|
||||||
|
LT_STATE="STATE"=14
|
||||||
|
TT_DIGITS=62
|
||||||
|
LT_DREXIT1="DREXIT1"=24
|
||||||
|
LT_IRPAUSE="IRPAUSE"=30
|
||||||
|
TT_SLCOMMENT=63
|
||||||
|
LT_ENDIR="ENDIR"=5
|
||||||
|
LT_DRSHIFT="DRSHIFT"=22
|
||||||
|
LT_MAXIMUM="MAXIMUM"=43
|
||||||
|
LT_SMASK="SMASK"=38
|
||||||
|
LT_FREQUENCY="FREQUENCY"=6
|
||||||
|
LT_TCK="TCK"=45
|
||||||
|
LT_HZ="HZ"=34
|
||||||
|
LT_RUNTEST="RUNTEST"=11
|
||||||
|
LT_HIR="HIR"=8
|
||||||
|
LT_IN="IN"=39
|
||||||
|
TT_INT=51
|
||||||
|
LT_Z="Z"=49
|
||||||
|
LT_TDI="TDI"=35
|
||||||
|
LT_RESET="RESET"=18
|
||||||
|
LT_SCK="SCK"=46
|
||||||
|
TT_VECTOR=58
|
||||||
|
TT_XDIGITS=67
|
||||||
|
LT_SIR="SIR"=13
|
||||||
|
TT_EXP=59
|
||||||
|
LT_IRSELECT="IRSELECT"=27
|
||||||
|
LT_TRST="TRST"=17
|
||||||
|
LT_IRSHIFT="IRSHIFT"=29
|
||||||
|
TT_FLOAT=52
|
||||||
|
TT_LPAREN=54
|
||||||
|
TT_NUMBER=57
|
||||||
|
LT_IREXIT2="IREXIT2"=32
|
||||||
|
TT_WHITESPACE=65
|
||||||
|
LT_ENDSTATE="ENDSTATE"=44
|
||||||
|
LT_PIOMAP="PIOMAP"=10
|
||||||
|
LT_DRCAPTURE="DRCAPTURE"=21
|
||||||
|
LT_SEC="SEC"=42
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
unit jtag.svfScanLexer;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This section is used for generating "uses" clause in the unit 'svfScanLexer'.
|
||||||
|
// Every unit name must be terminated with ';'
|
||||||
|
// e.g:
|
||||||
|
//
|
||||||
|
// uses
|
||||||
|
// {
|
||||||
|
// Classes;
|
||||||
|
// SysUtils;
|
||||||
|
// }
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
uses
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This section is used for generating "type" clause in the unit 'svfScanLexer'.
|
||||||
|
// The content of the section is verbatim copied into the generated code.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
type
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Lexer class declaration
|
||||||
|
// ============================================================================
|
||||||
|
lexer TsvfScanLexer;
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Lexer options
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
options
|
||||||
|
{
|
||||||
|
k = 2;
|
||||||
|
importVocab = jtag.svfLexer;
|
||||||
|
exportVocab = jtag.svfScanLexer;
|
||||||
|
caseSensitive = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Lexer tokens. Usualy string literals.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
tokens
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Lexer member declarations.
|
||||||
|
// All user defined member declarations should be placed here.
|
||||||
|
// The content of the section is verbatim copied into the generated code.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
memberdecl
|
||||||
|
{
|
||||||
|
protected
|
||||||
|
fOnNewline : TNotifyEvent;
|
||||||
|
|
||||||
|
public
|
||||||
|
property OnNewline : TNotifyEvent read fOnNewline write fOnNewline;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Begin rule definitions
|
||||||
|
//
|
||||||
|
// Remember: All lexer rule names must begin with UPPERCASE letter!
|
||||||
|
// ============================================================================
|
||||||
|
RPAREN: ')';
|
||||||
|
|
||||||
|
protected XDIGIT: '0'..'9' | 'a'..'f' | 'A'..'F' ;
|
||||||
|
XDIGITS: (XDIGIT)+;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// SLCOMMENT
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
SLCOMMENT
|
||||||
|
:
|
||||||
|
"//"
|
||||||
|
( ~( '\r' | '\n') )*
|
||||||
|
(
|
||||||
|
options
|
||||||
|
{
|
||||||
|
generateAmbigWarnings = false;
|
||||||
|
}
|
||||||
|
: '\r' '\n' { newLine; if Assigned( fOnNewline) then fOnNewline(self); }
|
||||||
|
| '\r' { newLine; if Assigned( fOnNewline) then fOnNewline(self); }
|
||||||
|
| '\n' { newLine; if Assigned( fOnNewline) then fOnNewline(self); }
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_ttype := TT_SKIP;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// NEWLINE
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
NEWLINE
|
||||||
|
:
|
||||||
|
(
|
||||||
|
options
|
||||||
|
{
|
||||||
|
generateAmbigWarnings = false;
|
||||||
|
}
|
||||||
|
: '\r' '\n' { newLine; if Assigned( fOnNewline) then fOnNewline(self); }
|
||||||
|
| '\r' { newLine; if Assigned( fOnNewline) then fOnNewline(self); }
|
||||||
|
| '\n' { newLine; if Assigned( fOnNewline) then fOnNewline(self); }
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_ttype := TT_SKIP;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// WHITESPACE
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
WHITESPACE
|
||||||
|
:
|
||||||
|
(
|
||||||
|
' '
|
||||||
|
| '\t' { tab; }
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_ttype := TT_SKIP;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// End rule definitions
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This section is used for generating member defintions in the unit 'svfScanLexer'.
|
||||||
|
// The content of the section is verbatim copied into the generated code.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
memberdef
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,448 @@
|
|||||||
|
// ============================================================================
|
||||||
|
// This file is generated by the Delphi Parser Generator.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// DPG version: 2.1.0.0r
|
||||||
|
// Grammar: jtag.svfscanLexer.g
|
||||||
|
// ============================================================================
|
||||||
|
unit jtag.svfScanLexer;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes,
|
||||||
|
dpgrtl.lexer,
|
||||||
|
dpgrtl.types,
|
||||||
|
jtag.svfScanLexerTokens,
|
||||||
|
SysUtils;
|
||||||
|
|
||||||
|
type
|
||||||
|
// =========================================================================
|
||||||
|
// Type declarations from grammar.
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Class TsvfScanLexer declaration
|
||||||
|
// =========================================================================
|
||||||
|
TsvfScanLexer = class( TLexer)
|
||||||
|
|
||||||
|
protected
|
||||||
|
fOnNewline : TNotifyEvent;
|
||||||
|
|
||||||
|
public
|
||||||
|
property OnNewline : TNotifyEvent read fOnNewline write fOnNewline;
|
||||||
|
|
||||||
|
protected // Internals
|
||||||
|
procedure initialize; override;
|
||||||
|
|
||||||
|
public // Protected grammar rules
|
||||||
|
// Must callable from parser too
|
||||||
|
procedure mXDIGIT ( pCreate: boolean);
|
||||||
|
|
||||||
|
public // Public grammar rules
|
||||||
|
procedure mRPAREN ( pCreate: boolean);
|
||||||
|
procedure mXDIGITS ( pCreate: boolean);
|
||||||
|
procedure mSLCOMMENT ( pCreate: boolean);
|
||||||
|
procedure mNEWLINE ( pCreate: boolean);
|
||||||
|
procedure mWHITESPACE ( pCreate: boolean);
|
||||||
|
|
||||||
|
public
|
||||||
|
function NextToken: IToken; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
dpgrtl.exception,
|
||||||
|
dpgrtl.token;
|
||||||
|
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mRPAREN
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfScanLexer.mRPAREN( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_RPAREN;
|
||||||
|
|
||||||
|
match(')');
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mXDIGIT
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfScanLexer.mXDIGIT( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_XDIGIT;
|
||||||
|
|
||||||
|
if (( LA(1) in ['0'..'9'])) then
|
||||||
|
begin
|
||||||
|
match( ['0'..'9']);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['a'..'f'])) then
|
||||||
|
begin
|
||||||
|
match( ['a'..'f']);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['A'..'F'])) then
|
||||||
|
begin
|
||||||
|
match( ['A'..'F']);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), ['0'..'9','A'..'F','a'..'f'], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mXDIGITS
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfScanLexer.mXDIGITS( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_cnt_5: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_XDIGITS;
|
||||||
|
|
||||||
|
_cnt_5 := 0;
|
||||||
|
|
||||||
|
while(true) do
|
||||||
|
begin
|
||||||
|
if (( LA(1) in ['0'..'9','A'..'F','a'..'f'])) then
|
||||||
|
begin
|
||||||
|
mXDIGIT(false);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if _cnt_5 >= 1 then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), ['0'..'9','A'..'F','a'..'f'], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
end;
|
||||||
|
|
||||||
|
INC(_cnt_5);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mSLCOMMENT
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfScanLexer.mSLCOMMENT( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_SLCOMMENT;
|
||||||
|
|
||||||
|
match('//');
|
||||||
|
|
||||||
|
while(true) do
|
||||||
|
begin
|
||||||
|
if (( LA(1) in [#1..#9,#11..#12,#14..#255])) then
|
||||||
|
begin
|
||||||
|
match( [#1..#9,#11..#12,#14..#255]);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (( LA(1) in [#13]) and (LA(2) in [#10])) then
|
||||||
|
begin
|
||||||
|
match(#13);
|
||||||
|
match(#10);
|
||||||
|
newLine; if Assigned( fOnNewline) then fOnNewline(self);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#13])) then
|
||||||
|
begin
|
||||||
|
match(#13);
|
||||||
|
newLine; if Assigned( fOnNewline) then fOnNewline(self);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#10])) then
|
||||||
|
begin
|
||||||
|
match(#10);
|
||||||
|
newLine; if Assigned( fOnNewline) then fOnNewline(self);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), [#10,#13], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
_ttype := TT_SKIP;
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mNEWLINE
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfScanLexer.mNEWLINE( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_NEWLINE;
|
||||||
|
|
||||||
|
if (( LA(1) in [#13]) and (LA(2) in [#10])) then
|
||||||
|
begin
|
||||||
|
match(#13);
|
||||||
|
match(#10);
|
||||||
|
newLine; if Assigned( fOnNewline) then fOnNewline(self);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#13])) then
|
||||||
|
begin
|
||||||
|
match(#13);
|
||||||
|
newLine; if Assigned( fOnNewline) then fOnNewline(self);
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#10])) then
|
||||||
|
begin
|
||||||
|
match(#10);
|
||||||
|
newLine; if Assigned( fOnNewline) then fOnNewline(self);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), [#10,#13], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
_ttype := TT_SKIP;
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// mWHITESPACE
|
||||||
|
// ============================================================================
|
||||||
|
procedure TsvfScanLexer.mWHITESPACE( pCreate: boolean);
|
||||||
|
var
|
||||||
|
_begin: integer;
|
||||||
|
_save: integer;
|
||||||
|
_token: IToken;
|
||||||
|
_ttype: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_begin := Length( TokenText) +1;
|
||||||
|
_token := nil;
|
||||||
|
_ttype := TT_WHITESPACE;
|
||||||
|
|
||||||
|
if (( LA(1) in [' '])) then
|
||||||
|
begin
|
||||||
|
match(' ');
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#9])) then
|
||||||
|
begin
|
||||||
|
match(#9);
|
||||||
|
tab;
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create( LA(1), [#9,' '], InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
_ttype := TT_SKIP;
|
||||||
|
|
||||||
|
if (_ttype <> TT_SKIP) and (pCreate = true) then
|
||||||
|
begin
|
||||||
|
_token := makeToken( _ttype);
|
||||||
|
_token.TokenText := Copy( TokenText, _begin, Length(TokenText)-_begin+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
ReturnToken := _token;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// NextToken
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
function TsvfScanLexer.NextToken : IToken;
|
||||||
|
var
|
||||||
|
_first : TCharSet;
|
||||||
|
|
||||||
|
begin
|
||||||
|
_first := [#9..#10,#13,' ',')','/'..'9','A'..'F','a'..'f'];
|
||||||
|
|
||||||
|
while( true) do
|
||||||
|
begin
|
||||||
|
ResetText;
|
||||||
|
|
||||||
|
try
|
||||||
|
if (( LA(1) in [')'])) then
|
||||||
|
begin
|
||||||
|
mRPAREN(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['0'..'9','A'..'F','a'..'f'])) then
|
||||||
|
begin
|
||||||
|
mXDIGITS(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in ['/'])) then
|
||||||
|
begin
|
||||||
|
mSLCOMMENT(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#10,#13])) then
|
||||||
|
begin
|
||||||
|
mNEWLINE(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else if (( LA(1) in [#9,' '])) then
|
||||||
|
begin
|
||||||
|
mWHITESPACE(true);
|
||||||
|
result := ReturnToken;
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if LA(1) = EOF_CHAR then
|
||||||
|
begin
|
||||||
|
uponEof;
|
||||||
|
result := TToken.Create(TT_EOF);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
Raise EMismatchedChar.Create(LA(1), _first, InputState.FileName, InputState.Line, InputState.Column);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// --------------------------------------------------------------
|
||||||
|
// If we found a SKIP token, then try again...
|
||||||
|
// --------------------------------------------------------------
|
||||||
|
if result = nil then
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// --------------------------------------------------------------
|
||||||
|
// Now we have a valid token, so exit the function
|
||||||
|
// --------------------------------------------------------------
|
||||||
|
break;
|
||||||
|
|
||||||
|
except
|
||||||
|
Raise;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// InitLiterals
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
procedure TsvfScanLexer.initialize;
|
||||||
|
begin
|
||||||
|
fCaseSensitive := false;
|
||||||
|
fLiterals.CaseSensitive := false;
|
||||||
|
|
||||||
|
fLiterals['drselect' ] := 20;
|
||||||
|
fLiterals['pio' ] := 9;
|
||||||
|
fLiterals['mask' ] := 37;
|
||||||
|
fLiterals['absent' ] := 50;
|
||||||
|
fLiterals['drupdate' ] := 26;
|
||||||
|
fLiterals['idle' ] := 19;
|
||||||
|
fLiterals['out' ] := 40;
|
||||||
|
fLiterals['hdr' ] := 7;
|
||||||
|
fLiterals['ircapture' ] := 28;
|
||||||
|
fLiterals['enddr' ] := 4;
|
||||||
|
fLiterals['off' ] := 48;
|
||||||
|
fLiterals['drpause' ] := 23;
|
||||||
|
fLiterals['tdo' ] := 36;
|
||||||
|
fLiterals['tir' ] := 16;
|
||||||
|
fLiterals['drexit2' ] := 25;
|
||||||
|
fLiterals['irupdate' ] := 33;
|
||||||
|
fLiterals['tdr' ] := 15;
|
||||||
|
fLiterals['sdr' ] := 12;
|
||||||
|
fLiterals['inout' ] := 41;
|
||||||
|
fLiterals['on' ] := 47;
|
||||||
|
fLiterals['irexit1' ] := 31;
|
||||||
|
fLiterals['state' ] := 14;
|
||||||
|
fLiterals['drexit1' ] := 24;
|
||||||
|
fLiterals['irpause' ] := 30;
|
||||||
|
fLiterals['endir' ] := 5;
|
||||||
|
fLiterals['drshift' ] := 22;
|
||||||
|
fLiterals['maximum' ] := 43;
|
||||||
|
fLiterals['tdi' ] := 35;
|
||||||
|
fLiterals['frequency' ] := 6;
|
||||||
|
fLiterals['hir' ] := 8;
|
||||||
|
fLiterals['hz' ] := 34;
|
||||||
|
fLiterals['runtest' ] := 11;
|
||||||
|
fLiterals['smask' ] := 38;
|
||||||
|
fLiterals['in' ] := 39;
|
||||||
|
fLiterals['tck' ] := 45;
|
||||||
|
fLiterals['z' ] := 49;
|
||||||
|
fLiterals['reset' ] := 18;
|
||||||
|
fLiterals['sck' ] := 46;
|
||||||
|
fLiterals['sir' ] := 13;
|
||||||
|
fLiterals['irselect' ] := 27;
|
||||||
|
fLiterals['trst' ] := 17;
|
||||||
|
fLiterals['irshift' ] := 29;
|
||||||
|
fLiterals['irexit2' ] := 32;
|
||||||
|
fLiterals['endstate' ] := 44;
|
||||||
|
fLiterals['drcapture' ] := 21;
|
||||||
|
fLiterals['piomap' ] := 10;
|
||||||
|
fLiterals['sec' ] := 42;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
// ============================================================================
|
||||||
|
// This file is generated by the Delphi Parser Generator.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// DPG version: 2.1.0.0r
|
||||||
|
// Grammar: jtag.svfscanLexer.g
|
||||||
|
// ============================================================================
|
||||||
|
unit jtag.svfScanLexerTokens;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
const
|
||||||
|
LT_DRSELECT = 20;
|
||||||
|
LT_PIO = 9;
|
||||||
|
LT_MASK = 37;
|
||||||
|
LT_ABSENT = 50;
|
||||||
|
TT_ID = 56;
|
||||||
|
TT_NEWLINE = 64;
|
||||||
|
TT_EOF = 1;
|
||||||
|
TT_SEMI = 53;
|
||||||
|
TT_DIGIT = 61;
|
||||||
|
LT_DRUPDATE = 26;
|
||||||
|
LT_IDLE = 19;
|
||||||
|
LT_OUT = 40;
|
||||||
|
LT_HDR = 7;
|
||||||
|
LT_IRCAPTURE = 28;
|
||||||
|
LT_ENDDR = 4;
|
||||||
|
LT_OFF = 48;
|
||||||
|
LT_DRPAUSE = 23;
|
||||||
|
LT_TDO = 36;
|
||||||
|
TT_XDIGIT = 66;
|
||||||
|
LT_TIR = 16;
|
||||||
|
LT_DREXIT2 = 25;
|
||||||
|
TT_SIGN = 60;
|
||||||
|
LT_IRUPDATE = 33;
|
||||||
|
LT_TDR = 15;
|
||||||
|
TT_RPAREN = 55;
|
||||||
|
LT_SDR = 12;
|
||||||
|
LT_INOUT = 41;
|
||||||
|
LT_ON = 47;
|
||||||
|
LT_IREXIT1 = 31;
|
||||||
|
LT_STATE = 14;
|
||||||
|
TT_DIGITS = 62;
|
||||||
|
LT_DREXIT1 = 24;
|
||||||
|
LT_IRPAUSE = 30;
|
||||||
|
TT_SLCOMMENT = 63;
|
||||||
|
LT_ENDIR = 5;
|
||||||
|
LT_DRSHIFT = 22;
|
||||||
|
LT_MAXIMUM = 43;
|
||||||
|
LT_TDI = 35;
|
||||||
|
LT_FREQUENCY = 6;
|
||||||
|
LT_HIR = 8;
|
||||||
|
LT_HZ = 34;
|
||||||
|
LT_RUNTEST = 11;
|
||||||
|
LT_SMASK = 38;
|
||||||
|
LT_IN = 39;
|
||||||
|
LT_TCK = 45;
|
||||||
|
LT_Z = 49;
|
||||||
|
LT_RESET = 18;
|
||||||
|
TT_INT = 51;
|
||||||
|
LT_SCK = 46;
|
||||||
|
TT_FLOAT = 52;
|
||||||
|
TT_VECTOR = 58;
|
||||||
|
LT_SIR = 13;
|
||||||
|
TT_EXP = 59;
|
||||||
|
LT_IRSELECT = 27;
|
||||||
|
LT_TRST = 17;
|
||||||
|
LT_IRSHIFT = 29;
|
||||||
|
TT_XDIGITS = 67;
|
||||||
|
TT_LPAREN = 54;
|
||||||
|
TT_NUMBER = 57;
|
||||||
|
LT_IREXIT2 = 32;
|
||||||
|
TT_WHITESPACE = 65;
|
||||||
|
LT_ENDSTATE = 44;
|
||||||
|
LT_DRCAPTURE = 21;
|
||||||
|
LT_PIOMAP = 10;
|
||||||
|
LT_SEC = 42;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
end.
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
// $Delphi Parser Generator: jtag.svfscanLexer.g -> jtag.svfscanLexer.gTokens.txt$
|
||||||
|
TsvfScanLexer
|
||||||
|
LT_DRSELECT="DRSELECT"=20
|
||||||
|
LT_PIO="PIO"=9
|
||||||
|
LT_MASK="MASK"=37
|
||||||
|
LT_ABSENT="ABSENT"=50
|
||||||
|
TT_ID=56
|
||||||
|
TT_NEWLINE=64
|
||||||
|
TT_EOF=1
|
||||||
|
TT_SEMI=53
|
||||||
|
TT_DIGIT=61
|
||||||
|
LT_DRUPDATE="DRUPDATE"=26
|
||||||
|
LT_IDLE="IDLE"=19
|
||||||
|
LT_OUT="OUT"=40
|
||||||
|
LT_HDR="HDR"=7
|
||||||
|
LT_IRCAPTURE="IRCAPTURE"=28
|
||||||
|
LT_ENDDR="ENDDR"=4
|
||||||
|
LT_OFF="OFF"=48
|
||||||
|
LT_DRPAUSE="DRPAUSE"=23
|
||||||
|
LT_TDO="TDO"=36
|
||||||
|
TT_XDIGIT=66
|
||||||
|
LT_TIR="TIR"=16
|
||||||
|
LT_DREXIT2="DREXIT2"=25
|
||||||
|
TT_SIGN=60
|
||||||
|
LT_IRUPDATE="IRUPDATE"=33
|
||||||
|
LT_TDR="TDR"=15
|
||||||
|
TT_RPAREN=55
|
||||||
|
LT_SDR="SDR"=12
|
||||||
|
LT_INOUT="INOUT"=41
|
||||||
|
LT_ON="ON"=47
|
||||||
|
LT_IREXIT1="IREXIT1"=31
|
||||||
|
LT_STATE="STATE"=14
|
||||||
|
TT_DIGITS=62
|
||||||
|
LT_DREXIT1="DREXIT1"=24
|
||||||
|
LT_IRPAUSE="IRPAUSE"=30
|
||||||
|
TT_SLCOMMENT=63
|
||||||
|
LT_ENDIR="ENDIR"=5
|
||||||
|
LT_DRSHIFT="DRSHIFT"=22
|
||||||
|
LT_MAXIMUM="MAXIMUM"=43
|
||||||
|
LT_TDI="TDI"=35
|
||||||
|
LT_FREQUENCY="FREQUENCY"=6
|
||||||
|
LT_HIR="HIR"=8
|
||||||
|
LT_HZ="HZ"=34
|
||||||
|
LT_RUNTEST="RUNTEST"=11
|
||||||
|
LT_SMASK="SMASK"=38
|
||||||
|
LT_IN="IN"=39
|
||||||
|
LT_TCK="TCK"=45
|
||||||
|
LT_Z="Z"=49
|
||||||
|
LT_RESET="RESET"=18
|
||||||
|
TT_INT=51
|
||||||
|
LT_SCK="SCK"=46
|
||||||
|
TT_FLOAT=52
|
||||||
|
TT_VECTOR=58
|
||||||
|
LT_SIR="SIR"=13
|
||||||
|
TT_EXP=59
|
||||||
|
LT_IRSELECT="IRSELECT"=27
|
||||||
|
LT_TRST="TRST"=17
|
||||||
|
LT_IRSHIFT="IRSHIFT"=29
|
||||||
|
TT_XDIGITS=67
|
||||||
|
TT_LPAREN=54
|
||||||
|
TT_NUMBER=57
|
||||||
|
LT_IREXIT2="IREXIT2"=32
|
||||||
|
TT_WHITESPACE=65
|
||||||
|
LT_ENDSTATE="ENDSTATE"=44
|
||||||
|
LT_DRCAPTURE="DRCAPTURE"=21
|
||||||
|
LT_PIOMAP="PIOMAP"=10
|
||||||
|
LT_SEC="SEC"=42
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
unit jtag.svfAstComment;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
jtag.svfAstNode;
|
||||||
|
|
||||||
|
type
|
||||||
|
TsvfAstComment = class( TsvfAstNode)
|
||||||
|
private
|
||||||
|
fComment : AnsiString;
|
||||||
|
|
||||||
|
public
|
||||||
|
function AsText: AnsiString; override;
|
||||||
|
|
||||||
|
public
|
||||||
|
constructor Create(Comment: AnsiString);
|
||||||
|
|
||||||
|
public
|
||||||
|
property Comment : AnsiString read fComment;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{ TsvfAstEndDR }
|
||||||
|
|
||||||
|
function TsvfAstComment.AsText: AnsiString;
|
||||||
|
begin
|
||||||
|
result := fComment;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TsvfAstComment.Create(Comment: AnsiString);
|
||||||
|
begin
|
||||||
|
fComment := Comment +#13#10
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
unit jtag.svfAstEndDR;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
jtag.svfAstNode,
|
||||||
|
jtag.svfLex;
|
||||||
|
|
||||||
|
type
|
||||||
|
TsvfAstEndDR = class( TsvfAstNode)
|
||||||
|
private
|
||||||
|
fState : byte;
|
||||||
|
|
||||||
|
public
|
||||||
|
function AsText: AnsiString; override;
|
||||||
|
public
|
||||||
|
constructor Create(State: byte);
|
||||||
|
|
||||||
|
public
|
||||||
|
property State: byte read fState;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
System.SysUtils,
|
||||||
|
jtag.svfProgram;
|
||||||
|
|
||||||
|
{ TsvfAstEndDR }
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// Constructor
|
||||||
|
// ================================================================================================
|
||||||
|
constructor TsvfAstEndDR.Create(State: byte);
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
fState := State;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// As Text
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfAstEndDR.AsText: AnsiString;
|
||||||
|
var
|
||||||
|
s: AnsiString;
|
||||||
|
|
||||||
|
begin
|
||||||
|
case fState of
|
||||||
|
stRESET : s := 'RESET';
|
||||||
|
stIDLE : s := 'IDLE';
|
||||||
|
stDRPAUSE : s := 'DRPAUSE';
|
||||||
|
stIRPAUSE : s := 'IRPAUSE';
|
||||||
|
end;
|
||||||
|
|
||||||
|
result := 'ENDDR ' +s+ ';' +#13#10;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
unit jtag.svfAstEndIR;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
jtag.svfAstNode,
|
||||||
|
jtag.svfLex;
|
||||||
|
|
||||||
|
type
|
||||||
|
TsvfAstEndIR = class( TsvfAstNode)
|
||||||
|
private
|
||||||
|
fState : byte;
|
||||||
|
fStateX : TTokenType;
|
||||||
|
|
||||||
|
public
|
||||||
|
function AsText: AnsiString; override;
|
||||||
|
|
||||||
|
public
|
||||||
|
constructor Create(State: byte);
|
||||||
|
|
||||||
|
public
|
||||||
|
property State: byte read fState;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
System.sysutils,
|
||||||
|
jtag.svfProgram;
|
||||||
|
|
||||||
|
{ TsvfAstEndIR }
|
||||||
|
|
||||||
|
constructor TsvfAstEndIR.Create(State: byte);
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
fState := State;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TsvfAstEndIR.AsText: AnsiString;
|
||||||
|
var
|
||||||
|
s: AnsiString;
|
||||||
|
|
||||||
|
begin
|
||||||
|
case fState of
|
||||||
|
stRESET : s := 'RESET';
|
||||||
|
stIDLE : s := 'IDLE';
|
||||||
|
stDRPAUSE : s := 'DRPAUSE';
|
||||||
|
stIRPAUSE : s := 'IRPAUSE';
|
||||||
|
end;
|
||||||
|
|
||||||
|
result := 'ENDIR ' +s+ ';' +#13#10;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
unit jtag.svfAstFreq;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
jtag.svfAstNode;
|
||||||
|
|
||||||
|
type
|
||||||
|
TsvfAstFreq = class( TsvfAstNode)
|
||||||
|
private
|
||||||
|
fFrequency: double;
|
||||||
|
|
||||||
|
public
|
||||||
|
function AsText: AnsiString; override;
|
||||||
|
public
|
||||||
|
constructor Create(Freq: double);
|
||||||
|
|
||||||
|
public
|
||||||
|
property Frequency : double read fFrequency;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
System.SysUtils;
|
||||||
|
|
||||||
|
{ TsvfAstFreq }
|
||||||
|
|
||||||
|
function TsvfAstFreq.AsText: AnsiString;
|
||||||
|
begin
|
||||||
|
result := Format('FREQUENCY %8.4e HZ;',[fFrequency])+#13#10;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TsvfAstFreq.Create(Freq: double);
|
||||||
|
begin
|
||||||
|
fFrequency := Freq
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
unit jtag.svfAstNode;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
type
|
||||||
|
TsvfAstNode = class
|
||||||
|
|
||||||
|
|
||||||
|
public
|
||||||
|
function AsText: AnsiString; virtual;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{ TsvfAstNode }
|
||||||
|
|
||||||
|
function TsvfAstNode.AsText: AnsiString;
|
||||||
|
begin
|
||||||
|
result := '';
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
unit jtag.svfAstPrint;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
jtag.svfAstNode;
|
||||||
|
|
||||||
|
type
|
||||||
|
TsvfAstPrint = class( TsvfAstNode)
|
||||||
|
public
|
||||||
|
Text : AnsiString;
|
||||||
|
|
||||||
|
public
|
||||||
|
constructor Create( AText: AnsiString);
|
||||||
|
function AsText: AnsiString; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
System.AnsiStrings;
|
||||||
|
|
||||||
|
{ TsvfAstPrint }
|
||||||
|
|
||||||
|
function TsvfAstPrint.AsText: AnsiString;
|
||||||
|
begin
|
||||||
|
result := Text
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TsvfAstPrint.Create( AText: AnsiString);
|
||||||
|
begin
|
||||||
|
Text := AnsiReplaceText(AText, '"', '');
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
unit jtag.svfAstRuntest;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
jtag.svfAstNode;
|
||||||
|
|
||||||
|
type
|
||||||
|
TsvfAstRuntest = class( TsvfAstNode)
|
||||||
|
private
|
||||||
|
fAllowData : boolean;
|
||||||
|
|
||||||
|
public
|
||||||
|
RunClock : AnsiString;
|
||||||
|
RunCount : AnsiString;
|
||||||
|
MinTime : AnsiString;
|
||||||
|
MaxTime : AnsiString;
|
||||||
|
RunState : byte;
|
||||||
|
EndState : byte;
|
||||||
|
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
function AsText: AnsiString; override;
|
||||||
|
|
||||||
|
public
|
||||||
|
procedure BeginData;
|
||||||
|
procedure EndData;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
jtag.svfProgram;
|
||||||
|
|
||||||
|
{ TsvfAstRuntest }
|
||||||
|
|
||||||
|
// @@@: Constructor/destructor ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
//
|
||||||
|
// Constructor/destructor
|
||||||
|
//
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ======================================================================================
|
||||||
|
// Constructor
|
||||||
|
// ======================================================================================
|
||||||
|
constructor TsvfAstRuntest.Create;
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
|
||||||
|
fAllowData := false;
|
||||||
|
|
||||||
|
RunClock := 'TCK';
|
||||||
|
RunCount := '';
|
||||||
|
MinTime := '';
|
||||||
|
MaxTime := '';
|
||||||
|
RunState := 1;
|
||||||
|
EndState := $FF;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ======================================================================================
|
||||||
|
// BeginData
|
||||||
|
// ======================================================================================
|
||||||
|
procedure TsvfAstRuntest.BeginData;
|
||||||
|
begin
|
||||||
|
fAllowData := true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ======================================================================================
|
||||||
|
// EndData
|
||||||
|
// ======================================================================================
|
||||||
|
procedure TsvfAstRuntest.EndData;
|
||||||
|
begin
|
||||||
|
fAllowData := false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// As Text
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfAstRuntest.AsText: AnsiString;
|
||||||
|
begin
|
||||||
|
result := 'RUNTEST';
|
||||||
|
|
||||||
|
if RunClock <> ''then
|
||||||
|
result := result +' '+ RunCount +' '+ RunClock;
|
||||||
|
|
||||||
|
if MinTime <> '' then
|
||||||
|
result := result +' '+ MinTime +' SEC';
|
||||||
|
|
||||||
|
if MaxTime <> '' then
|
||||||
|
result := result +' MAXIMUM '+ MaxTime +' SEC';
|
||||||
|
|
||||||
|
if EndState <> $FF then
|
||||||
|
begin
|
||||||
|
result := result +' ENDSTATE ';
|
||||||
|
|
||||||
|
case EndState of
|
||||||
|
stRESET : result := result +'RESET';
|
||||||
|
stIDLE : result := result +'IDLE';
|
||||||
|
stDRPAUSE : result := result +'DRPAUSE';
|
||||||
|
stIRPAUSE : result := result +'IRPAUSE';
|
||||||
|
else result := result +'InVaLiD';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
result := result +';' +#13#10#13#10;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,438 @@
|
|||||||
|
unit jtag.svfAstScan;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
System.SysUtils,
|
||||||
|
jtag.svfAstNode;
|
||||||
|
|
||||||
|
type
|
||||||
|
TsvfAstScan = class( TsvfAstNode)
|
||||||
|
|
||||||
|
private
|
||||||
|
fInst : AnsiString;
|
||||||
|
fLength : integer;
|
||||||
|
fBytes : integer;
|
||||||
|
fNibbles : integer; // memory size in 4 bit nibbles
|
||||||
|
|
||||||
|
fDataTDI : PByte;
|
||||||
|
fDataTDO : PByte;
|
||||||
|
fDataMASK : PByte;
|
||||||
|
fDataSMASK : PByte;
|
||||||
|
|
||||||
|
|
||||||
|
fLenTDI : integer;
|
||||||
|
fLenTDO : integer;
|
||||||
|
fLenMASK : integer;
|
||||||
|
fLenSMASK : integer;
|
||||||
|
|
||||||
|
fCursor : integer;
|
||||||
|
fCursorN : integer; // Cursor in 4 bit nibbles for data input
|
||||||
|
|
||||||
|
strict private
|
||||||
|
function GetDataTDI : pByteArray;
|
||||||
|
function GetDataTDO : pByteArray;
|
||||||
|
function GetDataMASK : pByteArray;
|
||||||
|
function GetDataSMASK : pByteArray;
|
||||||
|
|
||||||
|
public
|
||||||
|
function AsText: AnsiString; override;
|
||||||
|
|
||||||
|
public
|
||||||
|
constructor Create( Inst: AnsiString; Length: AnsiString);
|
||||||
|
destructor Destroy; override;
|
||||||
|
|
||||||
|
public
|
||||||
|
procedure AddTDI( Data: AnsiString);
|
||||||
|
procedure AddTDO( Data: AnsiString);
|
||||||
|
procedure AddMASK( Data: AnsiString);
|
||||||
|
procedure AddSMASK( Data: AnsiString);
|
||||||
|
|
||||||
|
procedure BeginData;
|
||||||
|
procedure EndData;
|
||||||
|
|
||||||
|
public
|
||||||
|
property Inst : AnsiString read fInst;
|
||||||
|
property Bits : integer read fLength;
|
||||||
|
property Bytes : integer read fBytes;
|
||||||
|
|
||||||
|
property DataTDI : PByteArray read GetDataTDI;
|
||||||
|
property DataTDO : PByteArray read GetDataTDO;
|
||||||
|
property DataMASK : PByteArray read GetDataMASK;
|
||||||
|
property DataSMASK: PByteArray read GetDataSMASK;
|
||||||
|
|
||||||
|
property LenTDI : integer read fLenTDI;
|
||||||
|
property LenTDO : integer read fLenTDO;
|
||||||
|
property LenMASK : integer read fLenMASK;
|
||||||
|
property LenSMASK : integer read fLenSMASK;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
Winapi.Windows,
|
||||||
|
// Dialogs,
|
||||||
|
jtag.svfProgram;
|
||||||
|
|
||||||
|
{ TsvfAstScan }
|
||||||
|
|
||||||
|
function hex2bin( hex: AnsiChar): byte;
|
||||||
|
begin
|
||||||
|
case hex of
|
||||||
|
'0'..'9': result := ord(hex) -ord('0');
|
||||||
|
'a'..'f': result := ord(hex) -ord('a') +10;
|
||||||
|
'A'..'F': result := ord(hex) -ord('A') +10;
|
||||||
|
else result := 0;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function hex2rbin( hex: AnsiChar): byte;
|
||||||
|
begin
|
||||||
|
case hex of
|
||||||
|
'0': result := $0;
|
||||||
|
'1': result := $8;
|
||||||
|
'2': result := $4;
|
||||||
|
'3': result := $C;
|
||||||
|
'4': result := $2;
|
||||||
|
'5': result := $A;
|
||||||
|
'6': result := $6;
|
||||||
|
'7': result := $E;
|
||||||
|
'8': result := $1;
|
||||||
|
'9': result := $9;
|
||||||
|
|
||||||
|
'A','a': result := $5;
|
||||||
|
'B','b': result := $D;
|
||||||
|
'C','c': result := $3;
|
||||||
|
'D','d': result := $B;
|
||||||
|
'E','e': result := $7;
|
||||||
|
'F','f': result := $F;
|
||||||
|
else result := 0;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// Constructor
|
||||||
|
// ================================================================================================
|
||||||
|
constructor TsvfAstScan.Create(Inst: AnsiString; Length: AnsiString);
|
||||||
|
begin
|
||||||
|
fInst := Inst;
|
||||||
|
fLength := StrToIntDef( Length, 0);
|
||||||
|
fBytes := ((fLength +7) div 8);
|
||||||
|
fNibbles := ((fLength +3) div 4);
|
||||||
|
|
||||||
|
|
||||||
|
fDataTDI := nil;
|
||||||
|
fDataTDO := nil;
|
||||||
|
fDataMASK := nil;
|
||||||
|
fDataSMASK := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// Destructor
|
||||||
|
// ================================================================================================
|
||||||
|
destructor TsvfAstScan.Destroy;
|
||||||
|
begin
|
||||||
|
if Assigned( fDataTDI) then FreeMem( fDataTDI);
|
||||||
|
if Assigned( fDataTDO) then FreeMem( fDataTDO);
|
||||||
|
if Assigned( fDataMASK) then FreeMem( fDataMASK);
|
||||||
|
if Assigned( fDataSMASK) then FreeMem( fDataSMASK);
|
||||||
|
|
||||||
|
inherited;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// BeginData
|
||||||
|
// ================================================================================================
|
||||||
|
procedure TsvfAstScan.BeginData;
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// EndData
|
||||||
|
// ================================================================================================
|
||||||
|
procedure TsvfAstScan.EndData;
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// GetDataTDI
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfAstScan.GetDataTDI: pByteArray;
|
||||||
|
begin
|
||||||
|
result := PByteArray( fDataTDI);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// GetDataTDO
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfAstScan.GetDataTDO: pByteArray;
|
||||||
|
begin
|
||||||
|
result := PByteArray( fDataTDO);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// GetDataMASK
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfAstScan.GetDataMASK: pByteArray;
|
||||||
|
begin
|
||||||
|
result := PByteArray( fDataMASK);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// GetDataSMASK
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfAstScan.GetDataSMASK: pByteArray;
|
||||||
|
begin
|
||||||
|
result := PByteArray( fDataSMASK);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// AddTDI
|
||||||
|
//
|
||||||
|
// Note: The TDI stream can have an arbitrary length.
|
||||||
|
// ================================================================================================
|
||||||
|
procedure TsvfAstScan.AddTDI( Data: AnsiString);
|
||||||
|
var
|
||||||
|
i : integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
i := 1;
|
||||||
|
|
||||||
|
if not Assigned( fDataTDI) then
|
||||||
|
begin
|
||||||
|
fLenTDI := 0;
|
||||||
|
fCursor := fBytes -1;
|
||||||
|
fCursorN := fNibbles -1;
|
||||||
|
fDataTDI := AllocMem( fBytes);
|
||||||
|
end;
|
||||||
|
|
||||||
|
while i <= Length(Data) do
|
||||||
|
begin
|
||||||
|
if fCursorN mod 2 <> 0
|
||||||
|
then DataTDI[fCursorN div 2] := hex2rbin(Data[i])
|
||||||
|
else DataTDI[fCursorN div 2] := (hex2rbin(Data[i]) shl 4) or DataTDI[fCursorN div 2];
|
||||||
|
|
||||||
|
DEC(fCursorN);
|
||||||
|
|
||||||
|
INC(fLenTDI);
|
||||||
|
INC(i);
|
||||||
|
|
||||||
|
// DataTDI[fCursor] := (hex2bin(Data[i]) shl 4) or hex2bin(Data[i+1]);;
|
||||||
|
|
||||||
|
// DEC(fCursor);
|
||||||
|
// INC(fLenTDI);
|
||||||
|
|
||||||
|
// INC(i, 2);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// AddTDO
|
||||||
|
// ================================================================================================
|
||||||
|
procedure TsvfAstScan.AddTDO( Data: AnsiString);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
i := 1;
|
||||||
|
|
||||||
|
if not Assigned( fDataTDO) then
|
||||||
|
begin
|
||||||
|
fLenTDO := 0;
|
||||||
|
fCursor := fBytes -1;
|
||||||
|
fCursorN := fNibbles -1;
|
||||||
|
fDataTDO := AllocMem( fBytes);
|
||||||
|
end;
|
||||||
|
|
||||||
|
while i <= Length(Data) do
|
||||||
|
begin
|
||||||
|
if fCursorN mod 2 <> 0
|
||||||
|
then DataTDO[fCursorN div 2] := hex2bin(Data[i]) shl 4
|
||||||
|
else DataTDO[fCursorN div 2] := hex2bin(Data[i]) or (byte(DataTDO[fCursorN div 2]));
|
||||||
|
|
||||||
|
DEC(fCursorN);
|
||||||
|
|
||||||
|
INC(fLenTDO);
|
||||||
|
INC(i);
|
||||||
|
|
||||||
|
// DataTDO[fCursor] := (hex2bin(Data[i]) shl 4) or hex2bin(Data[i+1]);;
|
||||||
|
//
|
||||||
|
// DEC(fCursor);
|
||||||
|
// INC(fLenTDO);
|
||||||
|
//
|
||||||
|
// INC(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// AddSMASK
|
||||||
|
// ================================================================================================
|
||||||
|
procedure TsvfAstScan.AddSMASK( Data: AnsiString);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
i := 1;
|
||||||
|
|
||||||
|
if not Assigned( fDataSMASK) then
|
||||||
|
begin
|
||||||
|
fLenSMASK := 0;
|
||||||
|
fCursor := fBytes-1;
|
||||||
|
fCursorN := fNibbles -1;
|
||||||
|
fDataSMASK := AllocMem( fBytes);
|
||||||
|
end;
|
||||||
|
|
||||||
|
while i <= Length(Data) do
|
||||||
|
begin
|
||||||
|
if fCursorN mod 2 <> 0
|
||||||
|
then DataSMASK[fCursorN div 2] := hex2rbin(Data[i])
|
||||||
|
else DataSMASK[fCursorN div 2] := (hex2rbin(Data[i]) shl 4) or DataSMASK[fCursorN div 2];
|
||||||
|
|
||||||
|
DEC(fCursorN);
|
||||||
|
|
||||||
|
INC(fLenSMASK);
|
||||||
|
INC(i);
|
||||||
|
|
||||||
|
// DataSMASK[fCursor] := (hex2bin(Data[i]) shl 4) or hex2bin(Data[i+1]);;
|
||||||
|
// DataTDI [fCursor] := DataTDI[fCursor] and DataSMASK[fCursor];
|
||||||
|
//
|
||||||
|
// DEC(fCursor);
|
||||||
|
// INC(fLenSMASK);
|
||||||
|
//
|
||||||
|
// INC(i, 2);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// AddMASK
|
||||||
|
// ================================================================================================
|
||||||
|
procedure TsvfAstScan.AddMASK( Data: AnsiString);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
i := 1;
|
||||||
|
|
||||||
|
if not Assigned( fDataMASK) then
|
||||||
|
begin
|
||||||
|
fLenMASK := 0;
|
||||||
|
fCursor := fBytes -1;
|
||||||
|
fCursorN := fNibbles -1;
|
||||||
|
fDataMASK := AllocMem( fBytes);
|
||||||
|
end;
|
||||||
|
|
||||||
|
while i <= Length(Data) do
|
||||||
|
begin
|
||||||
|
if fCursorN mod 2 <> 0
|
||||||
|
then DataMASK[fCursorN div 2] := hex2rbin(Data[i])
|
||||||
|
else DataMASK[fCursorN div 2] := (hex2rbin(Data[i]) shl 4) or DataMASK[fCursorN div 2];
|
||||||
|
|
||||||
|
DEC(fCursorN);
|
||||||
|
|
||||||
|
INC(fLenMASK);
|
||||||
|
INC(i);
|
||||||
|
|
||||||
|
// DataMASK[fCursor] := (hex2bin(Data[i]) shl 4) or hex2bin(Data[i+1]);;
|
||||||
|
//
|
||||||
|
// DEC(fCursor);
|
||||||
|
// INC(fLenMASK);
|
||||||
|
//
|
||||||
|
// INC(i, 2);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// AsText
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfAstScan.AsText: AnsiString;
|
||||||
|
|
||||||
|
const
|
||||||
|
spc = ' ';
|
||||||
|
|
||||||
|
|
||||||
|
function DumpData( PrefixLength: integer;
|
||||||
|
DataName : AnsiString;
|
||||||
|
Data : PByte;
|
||||||
|
DataLength : integer): AnsiString;
|
||||||
|
var
|
||||||
|
i : integer;
|
||||||
|
cnt: integer;
|
||||||
|
ptr: PByte;
|
||||||
|
b : byte;
|
||||||
|
s : AnsiChar;
|
||||||
|
|
||||||
|
|
||||||
|
begin
|
||||||
|
cnt := 0;
|
||||||
|
ptr := Data;
|
||||||
|
result := Format( '%-7s(',[DataName]);
|
||||||
|
|
||||||
|
for i:= 0 to DataLength-1 do
|
||||||
|
begin
|
||||||
|
if i mod 2 = 0
|
||||||
|
then b := (ptr^ shr 4) and $0f
|
||||||
|
else b := (ptr^ shr 0) and $0f;
|
||||||
|
|
||||||
|
case b of
|
||||||
|
$0: s := '0'; $1: s := '1'; $2: s := '2'; $3: s := '3';
|
||||||
|
$4: s := '4'; $5: s := '5'; $6: s := '6'; $7: s := '7';
|
||||||
|
$8: s := '8'; $9: s := '9'; $a: s := 'A'; $b: s := 'B';
|
||||||
|
$c: s := 'C'; $d: s := 'D'; $e: s := 'E'; $f: s := 'F';
|
||||||
|
end;
|
||||||
|
|
||||||
|
result := result +s;
|
||||||
|
|
||||||
|
if cnt = 60 then
|
||||||
|
begin
|
||||||
|
result := result +#13#10+ Copy(spc,1,PrefixLength+8);
|
||||||
|
cnt := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
INC(cnt);
|
||||||
|
|
||||||
|
if i mod 2 = 1 then
|
||||||
|
INC(ptr);
|
||||||
|
end;
|
||||||
|
|
||||||
|
result := result +')';
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
var
|
||||||
|
s: AnsiString;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
begin
|
||||||
|
if fLenTDI > 0
|
||||||
|
then result := Format('%3s %-8d',[fInst, fLength])
|
||||||
|
else result := Format('%3s %d', [fInst, fLength]);
|
||||||
|
|
||||||
|
if fLength > 0 then
|
||||||
|
begin
|
||||||
|
if fLenTDI > 0 then
|
||||||
|
result := result + DumpData( 12, 'TDI', fDataTDI, fLenTDI);
|
||||||
|
|
||||||
|
if fLenSMASK > 0 then
|
||||||
|
begin
|
||||||
|
result := result + #13#10+ Copy( spc, 1, 12);
|
||||||
|
result := result + DumpData( 12, 'SMASK', fDataSMASK, fLenSMASK);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if fLenTDO > 0 then
|
||||||
|
begin
|
||||||
|
result := result + #13#10+ Copy( spc, 1, 12);
|
||||||
|
result := result + DumpData( 12, 'TDO', fDataTDO, fLenTDO);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if fLenMASK > 0 then
|
||||||
|
begin
|
||||||
|
result := result + #13#10+ Copy( spc, 1, 12);
|
||||||
|
result := result + DumpData( 12, 'MASK', fDataMASK, fLenMASK);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
result := result +';' +#13#10;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
unit jtag.svfAstState;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
jtag.svfAstNode;
|
||||||
|
|
||||||
|
type
|
||||||
|
TsvfAstState = class( TsvfAstNode)
|
||||||
|
private
|
||||||
|
fStates : array[0..255] of byte;
|
||||||
|
fCursor : integer;
|
||||||
|
fAllowData : boolean;
|
||||||
|
|
||||||
|
function GetStateCount: integer;
|
||||||
|
function GetState(i:integer): byte;
|
||||||
|
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
|
||||||
|
public
|
||||||
|
function AsText: AnsiString; override;
|
||||||
|
|
||||||
|
procedure BeginData;
|
||||||
|
procedure EndData;
|
||||||
|
|
||||||
|
procedure AddState( State: byte);
|
||||||
|
|
||||||
|
public
|
||||||
|
property StateCount : integer read GetStateCount;
|
||||||
|
property States[i:integer] : byte read GetState;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
jtag.svfProgram;
|
||||||
|
|
||||||
|
{ TsvfAstState }
|
||||||
|
|
||||||
|
// @@@: Constructor/destructor ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
//
|
||||||
|
// Constructor/destructor
|
||||||
|
//
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ======================================================================================
|
||||||
|
// Constructor
|
||||||
|
// ======================================================================================
|
||||||
|
constructor TsvfAstState.Create;
|
||||||
|
begin
|
||||||
|
fCursor := 0;
|
||||||
|
fAllowData := false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// @@@: Property Handlers +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
//
|
||||||
|
// Property Handlers
|
||||||
|
//
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ======================================================================================
|
||||||
|
// GetStateCount
|
||||||
|
// ======================================================================================
|
||||||
|
function TsvfAstState.GetStateCount: integer;
|
||||||
|
begin
|
||||||
|
result := fCursor;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ======================================================================================
|
||||||
|
// GetState
|
||||||
|
// ======================================================================================
|
||||||
|
function TsvfAstState.GetState(i:integer): byte;
|
||||||
|
begin
|
||||||
|
if (i>=0) and (i<fCursor)
|
||||||
|
then result := fStates[i]
|
||||||
|
else result := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// @@@: Interface +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
//
|
||||||
|
// Interface
|
||||||
|
//
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ======================================================================================
|
||||||
|
// BeginData
|
||||||
|
// ======================================================================================
|
||||||
|
procedure TsvfAstState.BeginData;
|
||||||
|
begin
|
||||||
|
fCursor := 0;
|
||||||
|
fAllowData := true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ======================================================================================
|
||||||
|
// EndData
|
||||||
|
// ======================================================================================
|
||||||
|
procedure TsvfAstState.EndData;
|
||||||
|
begin
|
||||||
|
fAllowData := false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ======================================================================================
|
||||||
|
// AddState
|
||||||
|
// ======================================================================================
|
||||||
|
procedure TsvfAstState.AddState( State: byte);
|
||||||
|
begin
|
||||||
|
if fAllowData and (fCursor < 255) then
|
||||||
|
begin
|
||||||
|
fStates[fCursor] := State;
|
||||||
|
INC(fCursor);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// As Text
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfAstState.AsText: AnsiString;
|
||||||
|
|
||||||
|
function State( st: byte): AnsiString;
|
||||||
|
begin
|
||||||
|
case st of
|
||||||
|
stRESET : result := 'RESET';
|
||||||
|
stIDLE : result := 'IDLE';
|
||||||
|
|
||||||
|
stDRSELECT : result := 'DRSELECT';
|
||||||
|
stDRCAPTURE : result := 'DRCAPTURE';
|
||||||
|
stDRSHIFT : result := 'DRSHIFT';
|
||||||
|
stDREXIT1 : result := 'DREXIT1';
|
||||||
|
stDRPAUSE : result := 'DRPAUSE';
|
||||||
|
stDREXIT2 : result := 'DREXIT2';
|
||||||
|
stDRUPDATE : result := 'DRUPDATE';
|
||||||
|
|
||||||
|
stIRSELECT : result := 'IRSELECT';
|
||||||
|
stIRCAPTURE : result := 'IRCAPTURE';
|
||||||
|
stIRSHIFT : result := 'IRSHIFT';
|
||||||
|
stIREXIT1 : result := 'IREXIT1';
|
||||||
|
stIRPAUSE : result := 'IRPAUSE';
|
||||||
|
stIREXIT2 : result := 'IREXIT2';
|
||||||
|
stIRUPDATE : result := 'IRUPDATE';
|
||||||
|
|
||||||
|
else
|
||||||
|
result := 'InVaLiD';
|
||||||
|
end;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
result := 'STATE';
|
||||||
|
|
||||||
|
for i:=0 to StateCount -1 do
|
||||||
|
result := result + ' '+ State( States[i]);
|
||||||
|
|
||||||
|
result := result +';' +#13#10;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
unit jtag.svfFreq;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
jtag.svfAstNode;
|
||||||
|
|
||||||
|
type
|
||||||
|
TsvfAstFreq = class( TsvfAstNode)
|
||||||
|
private
|
||||||
|
fFrequency: double;
|
||||||
|
|
||||||
|
public
|
||||||
|
function AsText: AnsiString; override;
|
||||||
|
public
|
||||||
|
constructor Create(Freq: double);
|
||||||
|
|
||||||
|
public
|
||||||
|
property Frequency : double read fFrequency;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{ TsvfAstFreq }
|
||||||
|
|
||||||
|
function TsvfAstFreq.AsText: AnsiString;
|
||||||
|
begin
|
||||||
|
result := 'Frequency ...';
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TsvfAstFreq.Create(Freq: double);
|
||||||
|
begin
|
||||||
|
fFrequency := Freq
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,515 @@
|
|||||||
|
unit jtag.svfLex;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
System.Classes,
|
||||||
|
Generics.Collections;
|
||||||
|
|
||||||
|
type
|
||||||
|
TTokenType =
|
||||||
|
(
|
||||||
|
TT_EOF,
|
||||||
|
TT_SKIP,
|
||||||
|
TT_SEMI,
|
||||||
|
TT_COMMENT,
|
||||||
|
TT_ID,
|
||||||
|
TT_NUMBER,
|
||||||
|
TT_HEX,
|
||||||
|
TT_LPAREN,
|
||||||
|
TT_RPAREN,
|
||||||
|
TT_STRING,
|
||||||
|
|
||||||
|
// SVF commands
|
||||||
|
LT_ENDIR, LT_ENDDR,
|
||||||
|
LT_HIR, LT_HDR,
|
||||||
|
LT_TIR, LT_TDR,
|
||||||
|
LT_SIR, LT_SDR,
|
||||||
|
|
||||||
|
LT_FREQUENCY,
|
||||||
|
LT_HZ,
|
||||||
|
LT_PIO,
|
||||||
|
LT_PIOMAP,
|
||||||
|
|
||||||
|
LT_RUNTEST,
|
||||||
|
LT_TCK,
|
||||||
|
LT_SCK,
|
||||||
|
LT_SEC,
|
||||||
|
LT_MAXIMUM,
|
||||||
|
LT_ENDSTATE,
|
||||||
|
|
||||||
|
LT_TDI,
|
||||||
|
LT_TDO,
|
||||||
|
LT_MASK,
|
||||||
|
LT_SMASK,
|
||||||
|
|
||||||
|
// SVX commands
|
||||||
|
LT_PRINT,
|
||||||
|
|
||||||
|
// TAP States
|
||||||
|
LT_STATE,
|
||||||
|
|
||||||
|
LT_DRSELECT,
|
||||||
|
LT_DRCAPTURE,
|
||||||
|
LT_DRSHIFT,
|
||||||
|
LT_DRUPDATE,
|
||||||
|
LT_DREXIT1,
|
||||||
|
LT_DREXIT2,
|
||||||
|
|
||||||
|
LT_IRSELECT,
|
||||||
|
LT_IRCAPTURE,
|
||||||
|
LT_IRSHIFT,
|
||||||
|
LT_IRUPDATE,
|
||||||
|
LT_IREXIT1,
|
||||||
|
LT_IREXIT2,
|
||||||
|
|
||||||
|
LT_RESET,
|
||||||
|
LT_IDLE,
|
||||||
|
LT_IRPAUSE,
|
||||||
|
LT_DRPAUSE,
|
||||||
|
|
||||||
|
|
||||||
|
LT_IN,
|
||||||
|
LT_OUT,
|
||||||
|
LT_INOUT,
|
||||||
|
|
||||||
|
LT_TRST,
|
||||||
|
LT_ON,
|
||||||
|
LT_OFF,
|
||||||
|
LT_Z,
|
||||||
|
LT_ABSENT
|
||||||
|
);
|
||||||
|
|
||||||
|
TTokenTypes = set of TTokenType;
|
||||||
|
|
||||||
|
TsvfToken = class
|
||||||
|
TokenType : TTokenType;
|
||||||
|
TokenText : AnsiString;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TTokenMap = TDictionary<AnsiString,TTokenType>;
|
||||||
|
|
||||||
|
TAnsiCharSet = set of AnsiChar;
|
||||||
|
|
||||||
|
TsvfMode = ( SVF, HEX);
|
||||||
|
|
||||||
|
TsvfLEX = class
|
||||||
|
private
|
||||||
|
fBuffer : PAnsiChar;
|
||||||
|
fStart : PAnsiChar;
|
||||||
|
fForward : PAnsiChar;
|
||||||
|
|
||||||
|
fToken : TsvfToken;
|
||||||
|
fMode : TsvfMode;
|
||||||
|
|
||||||
|
fLiterals: TTokenMap;
|
||||||
|
|
||||||
|
private
|
||||||
|
procedure InitLiterals;
|
||||||
|
function CheckLiteral( ttext: AnsiString; ttype: TTokenType): TTokenType;
|
||||||
|
|
||||||
|
function MakeToken( ttype : TTokenType;
|
||||||
|
ttext : AnsiString): TsvfToken;
|
||||||
|
|
||||||
|
|
||||||
|
public
|
||||||
|
function NextToken : TsvfToken;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public
|
||||||
|
constructor Create( Stream: TStream);
|
||||||
|
destructor Destroy; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
WinAPI.Windows,
|
||||||
|
System.SysUtils;
|
||||||
|
|
||||||
|
{ TsvfLEX }
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// Constructor
|
||||||
|
// ================================================================================================
|
||||||
|
constructor TsvfLEX.Create(Stream: TStream);
|
||||||
|
var
|
||||||
|
size : Int64;
|
||||||
|
token : TsvfToken;
|
||||||
|
|
||||||
|
begin
|
||||||
|
InitLiterals;
|
||||||
|
|
||||||
|
if Assigned( Stream) then
|
||||||
|
begin
|
||||||
|
size := Stream.Size - Stream.Position;
|
||||||
|
fBuffer := GetMemory(size+1);
|
||||||
|
|
||||||
|
Stream.Read(fBuffer^, size);
|
||||||
|
|
||||||
|
fMode := SVF;
|
||||||
|
fStart := fBuffer;
|
||||||
|
fForward := fBuffer;
|
||||||
|
fBuffer[size] := #0;
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TsvfLEX.Destroy;
|
||||||
|
begin
|
||||||
|
FreeAndNil(fLiterals);
|
||||||
|
inherited;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// @@@: Internals +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
//
|
||||||
|
// Internals
|
||||||
|
//
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ================================================================================================
|
||||||
|
// MakeToken
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfLEX.MakeToken(ttype: TTokenType; ttext: AnsiString): TsvfToken;
|
||||||
|
begin
|
||||||
|
result := TsvfToken.Create;
|
||||||
|
|
||||||
|
with result do
|
||||||
|
begin
|
||||||
|
TokenType := ttype;
|
||||||
|
|
||||||
|
if TokenType in [TT_COMMENT,TT_STRING]
|
||||||
|
then TokenText := ttext
|
||||||
|
else TokenText := UpperCase(ttext);
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// InitLiterals
|
||||||
|
// ================================================================================================
|
||||||
|
procedure TsvfLEX.InitLiterals;
|
||||||
|
begin
|
||||||
|
fLiterals := TTokenMap.Create;
|
||||||
|
|
||||||
|
fLiterals.Add('HIR', LT_HIR );
|
||||||
|
fLiterals.Add('HDR', LT_HDR );
|
||||||
|
fLiterals.Add('TIR', LT_TIR );
|
||||||
|
fLiterals.Add('TDR', LT_TDR );
|
||||||
|
fLiterals.Add('SIR', LT_SIR );
|
||||||
|
fLiterals.Add('SDR', LT_SDR );
|
||||||
|
fLiterals.Add('TDI', LT_TDI );
|
||||||
|
fLiterals.Add('TDO', LT_TDO );
|
||||||
|
fLiterals.Add('MASK', LT_MASK );
|
||||||
|
fLiterals.Add('SMASK', LT_SMASK );
|
||||||
|
|
||||||
|
fLiterals.Add('FREQUENCY', LT_FREQUENCY );
|
||||||
|
fLiterals.Add('HZ', LT_HZ );
|
||||||
|
|
||||||
|
fLiterals.Add('PIO', LT_PIO );
|
||||||
|
fLiterals.Add('PIOMAP', LT_PIOMAP );
|
||||||
|
|
||||||
|
fLiterals.Add('RUNTEST', LT_RUNTEST );
|
||||||
|
fLiterals.Add('TCK', LT_TCK );
|
||||||
|
fLiterals.Add('SCK', LT_SCK );
|
||||||
|
fLiterals.Add('SEC', LT_SEC );
|
||||||
|
fLiterals.Add('MAXIMUM', LT_MAXIMUM );
|
||||||
|
fLiterals.Add('ENDSTATE', LT_ENDSTATE );
|
||||||
|
|
||||||
|
fLiterals.Add('ENDIR', LT_ENDIR );
|
||||||
|
fLiterals.Add('ENDDR', LT_ENDDR );
|
||||||
|
fLiterals.Add('STATE', LT_STATE );
|
||||||
|
|
||||||
|
fLiterals.Add('RESET', LT_RESET );
|
||||||
|
fLiterals.Add('IDLE', LT_IDLE );
|
||||||
|
|
||||||
|
fLiterals.Add('DRSELECT', LT_DRSELECT );
|
||||||
|
fLiterals.Add('DRCAPTURE', LT_DRCAPTURE );
|
||||||
|
fLiterals.Add('DRSHIFT', LT_DRSHIFT );
|
||||||
|
fLiterals.Add('DRUPDATE', LT_DRUPDATE );
|
||||||
|
fLiterals.Add('DRPAUSE', LT_DRPAUSE );
|
||||||
|
fLiterals.Add('DREXIT1', LT_DREXIT1 );
|
||||||
|
fLiterals.Add('DREXIT2', LT_DREXIT2 );
|
||||||
|
|
||||||
|
fLiterals.Add('IRSELECT', LT_IRSELECT );
|
||||||
|
fLiterals.Add('IRCAPTURE', LT_DRCAPTURE );
|
||||||
|
fLiterals.Add('IRSHIFT', LT_IRSHIFT );
|
||||||
|
fLiterals.Add('IRUPDATE', LT_IRUPDATE );
|
||||||
|
fLiterals.Add('IRPAUSE', LT_IRPAUSE );
|
||||||
|
fLiterals.Add('IREXIT1', LT_IREXIT1 );
|
||||||
|
fLiterals.Add('IREXIT2', LT_IREXIT2 );
|
||||||
|
|
||||||
|
fLiterals.Add('IN', LT_IN );
|
||||||
|
fLiterals.Add('OUT', LT_OUT );
|
||||||
|
fLiterals.Add('INOUT', LT_INOUT );
|
||||||
|
|
||||||
|
fLiterals.Add('TRST', LT_TRST );
|
||||||
|
fLiterals.Add('ON', LT_ON );
|
||||||
|
fLiterals.Add('OFF', LT_OFF );
|
||||||
|
fLiterals.Add('Z', LT_Z );
|
||||||
|
fLiterals.Add('ABSENT', LT_ABSENT );
|
||||||
|
|
||||||
|
fLiterals.Add('PRINT', LT_PRINT );
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// CheckLiteral
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfLEX.CheckLiteral(ttext: AnsiString; ttype: TTokenType): TTokenType;
|
||||||
|
begin
|
||||||
|
result := ttype;
|
||||||
|
fLiterals.TryGetValue(ttext, result);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// @@@: Interface +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
//
|
||||||
|
// Interface
|
||||||
|
//
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ================================================================================================
|
||||||
|
// NextToken
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfLEX.NextToken: TsvfToken;
|
||||||
|
|
||||||
|
function GetTokenText: AnsiString;
|
||||||
|
begin
|
||||||
|
SetLength( result, fForward-fStart);
|
||||||
|
MoveMemory( @result[1], fStart, fForward-fStart);
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
ttext : AnsiString;
|
||||||
|
ttype : TTokenType;
|
||||||
|
|
||||||
|
begin
|
||||||
|
while true do
|
||||||
|
begin
|
||||||
|
result := nil;
|
||||||
|
fForward := fStart;
|
||||||
|
|
||||||
|
if fMode = HEX then
|
||||||
|
case fForward^ of
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// HEX digits
|
||||||
|
// ----------------------------------------------------
|
||||||
|
'0'..'9','a'..'f','A'..'F':
|
||||||
|
begin
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
while fForward^ in ['0'..'9','a'..'f','A'..'F'] do
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
result := MakeToken( TT_HEX, GetTokenText);
|
||||||
|
fStart := fForward;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// HEX end
|
||||||
|
// ----------------------------------------------------
|
||||||
|
')':
|
||||||
|
begin
|
||||||
|
fMode := SVF;
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
result := MakeToken( TT_RPAREN, '');
|
||||||
|
fStart := fForward;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// SPACE,TAB
|
||||||
|
// ----------------------------------------------------
|
||||||
|
#32, #9: INC(fStart);
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// CR/LF
|
||||||
|
// ----------------------------------------------------
|
||||||
|
#13,#10:
|
||||||
|
begin
|
||||||
|
INC(fStart);
|
||||||
|
|
||||||
|
while fStart^ in [#13,#10] do
|
||||||
|
INC(fStart)
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// Invalid char
|
||||||
|
// ----------------------------------------------------
|
||||||
|
else
|
||||||
|
;
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
case fForward^ of
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// String
|
||||||
|
// ----------------------------------------------------
|
||||||
|
'"':
|
||||||
|
begin
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
while not (fForward^ in ['"',#13,#10]) do
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
if fForward^ = '"' then
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
result := MakeToken( TT_STRING, GetTokenText);
|
||||||
|
fStart := fForward;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// semicolon
|
||||||
|
// ----------------------------------------------------
|
||||||
|
';':
|
||||||
|
begin
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
result := MakeToken( TT_SEMI, ';');
|
||||||
|
fStart := fForward;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// comment
|
||||||
|
// ----------------------------------------------------
|
||||||
|
'!','/':
|
||||||
|
begin
|
||||||
|
if fForward^ = '/' then
|
||||||
|
begin
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
if fForward^ <> '/' then
|
||||||
|
; //raise
|
||||||
|
end;
|
||||||
|
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
while not (fForward^ in [#13,#10]) do
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
result := MakeToken( TT_COMMENT, GetTokenText);
|
||||||
|
fStart := fForward;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// id
|
||||||
|
// ----------------------------------------------------
|
||||||
|
'a'..'z','A'..'Z':
|
||||||
|
begin
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
while fForward^ in ['a'..'z','A'..'Z'] do
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
ttext := GetTokenText;
|
||||||
|
ttype := CheckLiteral( ttext, TT_ID);
|
||||||
|
result := MakeToken( ttype, ttext);
|
||||||
|
fStart := fForward;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// number
|
||||||
|
// ----------------------------------------------------
|
||||||
|
'0'..'9':
|
||||||
|
begin
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
while fForward^ in ['0'..'9'] do
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
if fForward^ = '.' then
|
||||||
|
begin
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
while fForward^ in ['0'..'9'] do
|
||||||
|
INC(fForward)
|
||||||
|
end;
|
||||||
|
|
||||||
|
if fForward^ in ['e','E'] then
|
||||||
|
begin
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
if fForward^ in ['+','-'] then
|
||||||
|
begin
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
if fForward^ in ['0'..'9'] then
|
||||||
|
begin
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
while fForward^ in ['0'..'9'] do
|
||||||
|
INC(fForward);
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
// raise
|
||||||
|
end
|
||||||
|
else
|
||||||
|
; // raise
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
result := MakeToken( TT_NUMBER, GetTokenText);
|
||||||
|
fStart := fForward;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// HEX start
|
||||||
|
// ----------------------------------------------------
|
||||||
|
'(':
|
||||||
|
begin
|
||||||
|
fMode := HEX;
|
||||||
|
INC(fForward);
|
||||||
|
|
||||||
|
result := MakeToken( TT_LPAREN, '');
|
||||||
|
fStart := fForward;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// WS,CR/LF
|
||||||
|
// ----------------------------------------------------
|
||||||
|
#32, #9: INC(fStart);
|
||||||
|
|
||||||
|
#13,#10:
|
||||||
|
begin
|
||||||
|
INC(fStart);
|
||||||
|
|
||||||
|
while fStart^ in [#13,#10] do
|
||||||
|
INC(fStart)
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// EOF
|
||||||
|
// ----------------------------------------------------
|
||||||
|
#0:
|
||||||
|
begin
|
||||||
|
result := MakeToken( TT_EOF, '');
|
||||||
|
fStart := fForward;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// invalid
|
||||||
|
// ----------------------------------------------------
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
fStart := 0;
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
if Assigned(result) then
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,424 @@
|
|||||||
|
unit jtag.svfPar;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
jtag.svfLex,
|
||||||
|
jtag.svfProgram;
|
||||||
|
|
||||||
|
type
|
||||||
|
TsvfPar = class
|
||||||
|
private
|
||||||
|
fLex : TsvfLex;
|
||||||
|
fPrg : TsvfProgram;
|
||||||
|
|
||||||
|
protected
|
||||||
|
function Match( ttype : TTokenType; dispose: boolean=true):TsvfToken; overload;
|
||||||
|
function Match( ttypes : TTokenTypes; dispose: boolean=true):TsvfToken; overload;
|
||||||
|
|
||||||
|
public
|
||||||
|
function SvfProgram: TsvfProgram;
|
||||||
|
|
||||||
|
public
|
||||||
|
constructor Create( Lex: TsvfLex);
|
||||||
|
destructor Destroy; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
System.SysUtils,
|
||||||
|
jtag.svfAstEndDR,
|
||||||
|
jtag.svfAstEndIR,
|
||||||
|
jtag.svfAstFreq,
|
||||||
|
jtag.svfAstRuntest,
|
||||||
|
jtag.svfAstScan,
|
||||||
|
jtag.svfAstState,
|
||||||
|
jtag.svfAstPrint,
|
||||||
|
jtag.svfAstComment;
|
||||||
|
|
||||||
|
|
||||||
|
{ TsvfPar }
|
||||||
|
|
||||||
|
constructor TsvfPar.Create(Lex: TsvfLex);
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
|
||||||
|
fLex := Lex;
|
||||||
|
fPrg := TsvfProgram.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TsvfPar.Destroy;
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// Match token
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfPar.Match( ttype: TTokenType; dispose: boolean):TsvfToken;
|
||||||
|
var
|
||||||
|
t: TsvfToken;
|
||||||
|
|
||||||
|
begin
|
||||||
|
t := fLex.NextToken;
|
||||||
|
|
||||||
|
if t.TokenType = ttype then
|
||||||
|
if dispose
|
||||||
|
then t.Free
|
||||||
|
else result := t
|
||||||
|
else
|
||||||
|
raise Exception.Create('Unexpected token');
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// Match tokens
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfPar.Match(ttypes: TTokenTypes; dispose: boolean): TsvfToken;
|
||||||
|
var
|
||||||
|
token: TsvfToken;
|
||||||
|
|
||||||
|
begin
|
||||||
|
result := nil;
|
||||||
|
token := fLex.NextToken;
|
||||||
|
|
||||||
|
if token.TokenType in ttypes then
|
||||||
|
if dispose
|
||||||
|
then token.Free
|
||||||
|
else result := token
|
||||||
|
else
|
||||||
|
raise Exception.Create('Unexpected token');
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// SVF Program
|
||||||
|
// ================================================================================================
|
||||||
|
function TsvfPar.SvfProgram : TsvfProgram;
|
||||||
|
|
||||||
|
function EndState( ttype: TTokenType): byte;
|
||||||
|
begin
|
||||||
|
case ttype of
|
||||||
|
LT_IDLE : result := stIDLE;
|
||||||
|
LT_RESET : result := stRESET;
|
||||||
|
LT_IRPAUSE : result := stIRPAUSE;
|
||||||
|
LT_DRPAUSE : result := stDRPAUSE;
|
||||||
|
|
||||||
|
else
|
||||||
|
raise Exception.Create('Invalid end state');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function RunState( ttype: TTokenType): byte;
|
||||||
|
begin
|
||||||
|
case ttype of
|
||||||
|
LT_IDLE : result := stIDLE;
|
||||||
|
LT_RESET : result := stRESET;
|
||||||
|
LT_IRPAUSE : result := stIRPAUSE;
|
||||||
|
LT_DRPAUSE : result := stDRPAUSE;
|
||||||
|
|
||||||
|
else
|
||||||
|
raise Exception.Create('Invalid run state');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function GenState( ttype: TTokenType): byte;
|
||||||
|
begin
|
||||||
|
case ttype of
|
||||||
|
LT_RESET : result := stRESET;
|
||||||
|
LT_IDLE : result := stIDLE;
|
||||||
|
|
||||||
|
LT_DRSELECT : result := stDRSELECT;
|
||||||
|
LT_DRCAPTURE: result := stDRCAPTURE;
|
||||||
|
LT_DRSHIFT : result := stDRSHIFT;
|
||||||
|
LT_DREXIT1 : result := stDREXIT1;
|
||||||
|
LT_DRPAUSE : result := stDRPAUSE;
|
||||||
|
LT_DREXIT2 : result := stDREXIT2;
|
||||||
|
LT_DRUPDATE : result := stDRUPDATE;
|
||||||
|
|
||||||
|
LT_IRSELECT : result := stIRSELECT;
|
||||||
|
LT_IRCAPTURE: result := stIRCAPTURE;
|
||||||
|
LT_IRSHIFT : result := stIRSHIFT;
|
||||||
|
LT_IREXIT1 : result := stIREXIT1;
|
||||||
|
LT_IRPAUSE : result := stIRPAUSE;
|
||||||
|
LT_IREXIT2 : result := stIREXIT2;
|
||||||
|
LT_IRUPDATE : result := stIRUPDATE;
|
||||||
|
|
||||||
|
else
|
||||||
|
raise Exception.Create('Invalid run state');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
cmd: TsvfToken;
|
||||||
|
p1 : TsvfToken;
|
||||||
|
p2 : TsvfToken;
|
||||||
|
p3 : TsvfToken;
|
||||||
|
|
||||||
|
f : double;
|
||||||
|
scan : TsvfAstScan;
|
||||||
|
run : TsvfAstRuntest;
|
||||||
|
st : TsvfAstState;
|
||||||
|
|
||||||
|
tt1 : TTokenTypes;
|
||||||
|
tt2 : TTokenTypes;
|
||||||
|
tt1s : TTokenTypes;
|
||||||
|
|
||||||
|
begin
|
||||||
|
result := nil;
|
||||||
|
scan := nil;
|
||||||
|
|
||||||
|
tt1 := [LT_DRSELECT .. LT_DRPAUSE];
|
||||||
|
tt2 := [LT_RESET .. LT_DRPAUSE];
|
||||||
|
tt1s := [LT_DRSELECT .. LT_DRPAUSE,TT_SEMI];
|
||||||
|
|
||||||
|
|
||||||
|
if Assigned(fLex) then
|
||||||
|
begin
|
||||||
|
while true do
|
||||||
|
begin
|
||||||
|
p1 := nil;
|
||||||
|
p2 := nil;
|
||||||
|
p3 := nil;
|
||||||
|
cmd := fLex.NextToken;
|
||||||
|
|
||||||
|
case cmd.TokenType of
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
// PRINT
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
LT_PRINT:
|
||||||
|
begin
|
||||||
|
p1 := Match(TT_STRING, false);
|
||||||
|
fPrg.AddStatement( TsvfAstPrint.Create(p1.TokenText));
|
||||||
|
p1.Free
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
// ENDIR, ENDDR
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
LT_ENDIR,LT_ENDDR:
|
||||||
|
begin
|
||||||
|
p1 := Match([LT_RESET,LT_IDLE,LT_DRPAUSE,LT_IRPAUSE],false);
|
||||||
|
Match(TT_SEMI);
|
||||||
|
|
||||||
|
case cmd.TokenType of
|
||||||
|
LT_ENDIR: fPrg.AddStatement( TsvfAstEndIR.Create(EndState(p1.TokenType)));
|
||||||
|
LT_ENDDR: fPrg.AddStatement( TsvfAstEndDR.Create(EndState(p1.TokenType)));
|
||||||
|
end;
|
||||||
|
|
||||||
|
p1.Free
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
// FREQUENCY
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
LT_FREQUENCY:
|
||||||
|
begin
|
||||||
|
f := 1E6;
|
||||||
|
p1 := Match([TT_NUMBER,TT_SEMI],false);
|
||||||
|
|
||||||
|
if p1.TokenType <> TT_SEMI then
|
||||||
|
begin
|
||||||
|
Match(LT_HZ);
|
||||||
|
Match(TT_SEMI);
|
||||||
|
|
||||||
|
f := StrToFloat(p1.TokenText);
|
||||||
|
end;
|
||||||
|
|
||||||
|
fPrg.AddStatement( TsvfAstFreq.Create( f));
|
||||||
|
|
||||||
|
p1.Free
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
// HIR,HDR,TIR,TDR,SIR,SDR
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
LT_HIR,LT_HDR,LT_TIR,LT_TDR,LT_SIR,LT_SDR:
|
||||||
|
begin
|
||||||
|
p1 := Match( TT_NUMBER, false);
|
||||||
|
p2 := Match( [LT_TDI,LT_TDO,LT_MASK,LT_SMASK,TT_SEMI], false);
|
||||||
|
|
||||||
|
scan := TsvfAstScan.Create(cmd.TokenText, p1.TokenText);
|
||||||
|
|
||||||
|
while p2.TokenType <> TT_SEMI do
|
||||||
|
begin
|
||||||
|
Match(TT_LPAREN);
|
||||||
|
|
||||||
|
scan.BeginData;
|
||||||
|
|
||||||
|
while true do
|
||||||
|
begin
|
||||||
|
p3 := Match( [TT_HEX,TT_RPAREN],false);
|
||||||
|
|
||||||
|
if p3.TokenType = TT_RPAREN then
|
||||||
|
begin
|
||||||
|
scan.EndData;
|
||||||
|
|
||||||
|
p3.Free;
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
case p2.TokenType of
|
||||||
|
LT_TDI : scan.AddTDI( p3.TokenText);
|
||||||
|
LT_TDO : scan.AddTDO( p3.TokenText);
|
||||||
|
LT_MASK : scan.AddMASK( p3.TokenText);
|
||||||
|
LT_SMASK : scan.AddSMASK( p3.TokenText);
|
||||||
|
end;
|
||||||
|
|
||||||
|
p3.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
p2.Free;
|
||||||
|
p2 := Match( [LT_TDI,LT_TDO,LT_MASK,LT_SMASK,TT_SEMI], false);
|
||||||
|
end;
|
||||||
|
|
||||||
|
FreeAndNil(p2);
|
||||||
|
FreeAndNil(p1);
|
||||||
|
|
||||||
|
fPrg.AddStatement(scan);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
// RUNTEST
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
LT_RUNTEST:
|
||||||
|
begin
|
||||||
|
run := TsvfAstRuntest.Create;
|
||||||
|
|
||||||
|
p1 := nil;
|
||||||
|
p2 := fLex.NextToken;
|
||||||
|
|
||||||
|
if p2.TokenType <> TT_NUMBER then
|
||||||
|
begin
|
||||||
|
p1 := p2;
|
||||||
|
p2 := Match( TT_NUMBER, false);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if Assigned(p1) then
|
||||||
|
run.RunState:= RunState(p1.TokenType);
|
||||||
|
|
||||||
|
p3 := Match( [LT_SCK,LT_TCK,LT_SEC], false);
|
||||||
|
|
||||||
|
if p3.TokenType in [LT_SCK,LT_TCK] then
|
||||||
|
begin
|
||||||
|
run.RunClock := p3.TokenText;
|
||||||
|
run.RunCount := p2.TokenText;
|
||||||
|
end
|
||||||
|
|
||||||
|
else begin
|
||||||
|
run.MinTime := p2.TokenText;
|
||||||
|
end;
|
||||||
|
|
||||||
|
FreeAndNil(p3);
|
||||||
|
FreeAndNil(p2);
|
||||||
|
FreeAndNil(p1);
|
||||||
|
|
||||||
|
p1 := Match( [TT_NUMBER,LT_MAXIMUM,LT_ENDSTATE,TT_SEMI], false);
|
||||||
|
|
||||||
|
if p1.TokenType = TT_NUMBER then
|
||||||
|
begin
|
||||||
|
Match(LT_SEC);
|
||||||
|
run.MinTime := p1.TokenText;
|
||||||
|
|
||||||
|
FreeAndNil(p1);
|
||||||
|
p1 := Match([LT_MAXIMUM,LT_ENDSTATE,TT_SEMI],false)
|
||||||
|
end;
|
||||||
|
|
||||||
|
if p1.TokenType = LT_MAXIMUM then
|
||||||
|
begin
|
||||||
|
Match(LT_SEC);
|
||||||
|
run.MaxTime := p1.TokenText;
|
||||||
|
|
||||||
|
FreeAndNil(p1);
|
||||||
|
p1 := Match([LT_ENDSTATE,TT_SEMI],false);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if p1.TokenType = LT_ENDSTATE then
|
||||||
|
begin
|
||||||
|
p2 := Match(tt2,false);
|
||||||
|
run.EndState := EndState(p2.TokenType);
|
||||||
|
|
||||||
|
FreeAndNil(p2);
|
||||||
|
FreeAndNil(p1);
|
||||||
|
|
||||||
|
p1 := Match(TT_SEMI, false);
|
||||||
|
end;
|
||||||
|
|
||||||
|
FreeAndNil(p1);
|
||||||
|
|
||||||
|
fPrg.AddStatement(run);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
// STATE
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
LT_STATE:
|
||||||
|
begin
|
||||||
|
st := TsvfAstState.Create;
|
||||||
|
p1 := Match( tt1,false);
|
||||||
|
|
||||||
|
st.BeginData;
|
||||||
|
|
||||||
|
while p1.TokenType <> TT_SEMI do
|
||||||
|
begin
|
||||||
|
st.AddState(GenState(p1.TokenType));
|
||||||
|
|
||||||
|
// stable state can be followed with SEMI
|
||||||
|
if p1.TokenType in tt2 then
|
||||||
|
begin
|
||||||
|
p1.Free;
|
||||||
|
p1 := Match( tt1s,false);
|
||||||
|
end
|
||||||
|
|
||||||
|
else begin
|
||||||
|
p1.Free;
|
||||||
|
p1 := Match( tt1,false);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
FreeAndNil(p1);
|
||||||
|
|
||||||
|
st.EndData;
|
||||||
|
fPrg.AddStatement(st);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
// TRST
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
LT_TRST:
|
||||||
|
begin
|
||||||
|
p1 := Match( [LT_ON,LT_OFF,LT_Z,LT_ABSENT],false);
|
||||||
|
Match(TT_SEMI);
|
||||||
|
|
||||||
|
// ...
|
||||||
|
|
||||||
|
p1.Free
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
// Comment
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
TT_COMMENT:
|
||||||
|
begin
|
||||||
|
fPrg.AddStatement( TsvfAstComment.Create(cmd.TokenText));
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
// End Of File
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
TT_EOF:
|
||||||
|
begin
|
||||||
|
cmd.Free;
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
cmd.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
result := fPrg;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,155 @@
|
|||||||
|
unit jtag.svfProgram;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
jtag.svfAstNode,
|
||||||
|
System.Contnrs;
|
||||||
|
|
||||||
|
const
|
||||||
|
stRESET = 0;
|
||||||
|
stIDLE = 1;
|
||||||
|
|
||||||
|
stDRSELECT = 2;
|
||||||
|
stDRCAPTURE = 3;
|
||||||
|
stDRSHIFT = 4;
|
||||||
|
stDRPAUSE = 5;
|
||||||
|
stDREXIT1 = 6;
|
||||||
|
stDREXIT2 = 7;
|
||||||
|
stDRUPDATE = 8;
|
||||||
|
|
||||||
|
stIRSELECT = 9;
|
||||||
|
stIRCAPTURE = 10;
|
||||||
|
stIRSHIFT = 11;
|
||||||
|
stIRPAUSE = 12;
|
||||||
|
stIREXIT1 = 13;
|
||||||
|
stIREXIT2 = 14;
|
||||||
|
stIRUPDATE = 15;
|
||||||
|
|
||||||
|
stNONDEF = $ff;
|
||||||
|
|
||||||
|
type
|
||||||
|
TsvfProgram = class
|
||||||
|
private
|
||||||
|
fStatements : TObjectList;
|
||||||
|
|
||||||
|
function GetStatementCount : integer;
|
||||||
|
function GetStatement(i: integer): TsvfAstNode;
|
||||||
|
|
||||||
|
public
|
||||||
|
procedure AddStatement( Stmt: TsvfAstNode);
|
||||||
|
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
destructor Destroy; override;
|
||||||
|
|
||||||
|
procedure Dump( FileName: string);
|
||||||
|
|
||||||
|
public
|
||||||
|
property StatementCount : integer read GetStatementCount;
|
||||||
|
property Statements[i: integer] : TsvfAstNode read GetStatement;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
System.Classes;
|
||||||
|
|
||||||
|
{ TsvfProgram }
|
||||||
|
|
||||||
|
// @@@: Constructor/destructor ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
//
|
||||||
|
// Constructor/destructor
|
||||||
|
//
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ======================================================================================
|
||||||
|
// Constructor
|
||||||
|
// ======================================================================================
|
||||||
|
constructor TsvfProgram.Create;
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
fStatements := TObjectList.Create( true);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ======================================================================================
|
||||||
|
// Destructor
|
||||||
|
// ======================================================================================
|
||||||
|
destructor TsvfProgram.Destroy;
|
||||||
|
begin
|
||||||
|
fStatements.Free;
|
||||||
|
inherited;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// @@@: Interface +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
//
|
||||||
|
// Interface
|
||||||
|
//
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ======================================================================================
|
||||||
|
// AddStatement
|
||||||
|
// ======================================================================================
|
||||||
|
procedure TsvfProgram.AddStatement(Stmt: TsvfAstNode);
|
||||||
|
begin
|
||||||
|
fStatements.Add( Stmt);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ================================================================================================
|
||||||
|
// Dump
|
||||||
|
// ================================================================================================
|
||||||
|
procedure TsvfProgram.Dump(FileName: string);
|
||||||
|
var
|
||||||
|
i : integer;
|
||||||
|
s : AnsiString;
|
||||||
|
stm : TMemoryStream;
|
||||||
|
|
||||||
|
|
||||||
|
begin
|
||||||
|
stm := TMemoryStream.Create;
|
||||||
|
|
||||||
|
for i:=0 to StatementCount -1 do
|
||||||
|
begin
|
||||||
|
s := Statements[i].AsText;
|
||||||
|
stm.Write(s[1], Length(s));
|
||||||
|
end;
|
||||||
|
|
||||||
|
stm.SaveToFile(FileName);
|
||||||
|
stm.Free
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// @@@: Property Handlers +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
//
|
||||||
|
// Property Handlers
|
||||||
|
//
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// ======================================================================================
|
||||||
|
// GetStatementCount
|
||||||
|
// ======================================================================================
|
||||||
|
function TsvfProgram.GetStatementCount: integer;
|
||||||
|
begin
|
||||||
|
result := fStatements.Count;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// ======================================================================================
|
||||||
|
// GetStatement
|
||||||
|
// ======================================================================================
|
||||||
|
function TsvfProgram.GetStatement(i: integer): TsvfAstNode;
|
||||||
|
begin
|
||||||
|
if (i>=0) and (i<fStatements.Count)
|
||||||
|
then result := fStatements[i] as TsvfAstNode
|
||||||
|
else result := nil
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
end.
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,46 @@
|
|||||||
|
unit jtag.vme.tools;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
function FlipByte( Data: byte): byte;
|
||||||
|
function FlipWord( Data: word): word;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
function FlipByte( Data: byte): byte;
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
result := 0;
|
||||||
|
|
||||||
|
for i:=0 to 7 do
|
||||||
|
begin
|
||||||
|
result := result shl 1;
|
||||||
|
|
||||||
|
if Data and $01 = $01 then
|
||||||
|
result := result or $1;
|
||||||
|
|
||||||
|
Data := Data shr 1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function FlipWord( Data: word): word;
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
result := 0;
|
||||||
|
|
||||||
|
for i:=0 to 15 do
|
||||||
|
begin
|
||||||
|
result := result shl 1;
|
||||||
|
|
||||||
|
if Data and $01 = $01 then
|
||||||
|
result := result or $1;
|
||||||
|
|
||||||
|
Data := Data shr 1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
Reference in New Issue
Block a user