Initial check in

This commit is contained in:
2026-01-08 19:12:06 +01:00
commit a30568e2a9
35 changed files with 11750 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
*.dcu
*.exe
*.res
*.identcache
*.local
*.dsk
*.dsv
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+58
View File
@@ -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
+48
View File
@@ -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.
+247
View File
@@ -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
{
}
+785
View File
@@ -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
+376
View File
@@ -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;
}
+688
View File
@@ -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
+137
View File
@@ -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
{
}
+448
View File
@@ -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
+37
View File
@@ -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.
+57
View File
@@ -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.
+56
View File
@@ -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.
+37
View File
@@ -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.
+22
View File
@@ -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.
+34
View File
@@ -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.
+110
View File
@@ -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.
+438
View File
@@ -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.
+168
View File
@@ -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.
+35
View File
@@ -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.
+515
View File
@@ -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.
+424
View File
@@ -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.
+155
View File
@@ -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
+46
View File
@@ -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.