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
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.