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