RDL-Editor/com.minres.rdl.parent/com.minres.rdl/src/com/minres/rdl/RDL.xtext

405 lines
8.8 KiB
Plaintext
Raw Normal View History

2017-09-12 12:48:21 +02:00
//grammar com.minres.rdl.RDL with org.eclipse.xtext.common.Terminals
grammar com.minres.rdl.RDL hidden(WS, ML_COMMENT, SL_COMMENT, ESCAPE_JSP, ESCAPE_ORDL)
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate rdl "http://www.minres.com/rdl/RDL"
Root:
(
includes+=Include |
componentDefinitions+=ComponentDefinition';'|
enumDefinitions+=EnumDefinition ';'|
instantiations+=Instantiation ';'|
propertyAssignments+=PropertyAssignment ';'|
propertyDefinitions+=PropertyDefinition ';'
) *
2017-09-12 12:48:21 +02:00
;
Include:
'`include' importURI=STR
;
PropertyDefinition:
'property' name=ID '{'
(
"type" '=' type=PropertyTypeName ';' (usage=PropertyUsage default=PropertyDefault? | default=PropertyDefault usage=PropertyUsage) |
usage=PropertyUsage ("type" '=' type=PropertyTypeName ';' default=PropertyDefault? | default=PropertyDefault "type" '=' type=PropertyTypeName ';') |
default=PropertyDefault ("type" '=' type=PropertyTypeName ';' usage=PropertyUsage | usage=PropertyUsage "type" '=' type=PropertyTypeName ';')
) '}' ';'
;
enum PropertyTypeName:
STRING="string" | NUMBER="number" | BOOLEAN="boolean" | ADDRMAP="addrmap" | REG="reg" | REGFILE="regfile" | FIELD="field" | REF="ref"
;
PropertyDefault:
"default" '=' (string=STR | value=NUM | string="true" | string="false") ';'
;
PropertyUsage:
"component" '=' components+=PropertyComponent ('|' components+=PropertyComponent)* ';'
;
enum PropertyComponent:
SIGNAL="signal" | ADDRMAP="addrmap" | REG="reg" | REGFILE="regfile" | FIELD="field" | ALL="all"
;
ComponentDefinition:
type=ComponentDefinitionType name=ID?
'{'
( componentDefinitions+=ComponentDefinition ';'
| instantiations+=Instantiation ';'
| propertyAssignments+=PropertyAssignment ';'
| enumDefinitions+=EnumDefinition ';'
)* '}'
2017-09-12 12:48:21 +02:00
;
enum ComponentDefinitionType:
SIGNAL="signal" | ADDRMAP="addrmap" | REGFILE="regfile" | REG="reg" | FIELD="field"
;
Instantiation:
(
2018-06-02 18:41:09 +02:00
instanceType=EnumInstanceType? ("alias" alias=ID)?
componentRef=[ComponentDefinition] | component=ComponentDefinition instanceType=EnumInstanceType?
) componentInstances+=ComponentInstance (',' componentInstances+=ComponentInstance)*
2017-09-12 12:48:21 +02:00
;
ComponentInstance:
name=ID (range=Range)?
//reset
('=' reset=NUM)?
//address
('@' address=NUM)?
//addr inc
('+=' addrInc=NUM)?
//addr mod
('%=' addrMod=NUM)?
;
Range:
'[' (left=NUM ':' right=NUM | size=NUM) ']'
2017-09-12 12:48:21 +02:00
;
PropertyAssignment:
DefaultProperyAssignment | ExplicitPropertyAssignment | PostPropertyAssignment
;
DefaultProperyAssignment:
"default" ExplicitPropertyAssignment
;
ExplicitPropertyAssignment :
modifier=PropertyModifier name=Property |
name=Property ('=' rhs=PropertyAssignmentRhs)?
2017-09-12 12:48:21 +02:00
;
PostPropertyAssignment:
(instance=HierInstanceRef '->' (propertyEnum=Property | property=[PropertyDefinition]) |
property=[PropertyDefinition] ) ('=' rhs=PropertyAssignmentRhs)?
2017-09-12 12:48:21 +02:00
;
InstancePropertyRef:
instance=InstanceRef ('->' (propertyEnum=Property | property=[PropertyDefinition]))?
;
// unused rule to infer inheritance
2017-09-12 12:48:21 +02:00
Entity:
ComponentInstance|EnumDefinition|PropertyDefinition
;
InstanceRef:
instance=[Entity] ( "." tail=HierInstanceRef)?
;
2017-09-12 12:48:21 +02:00
HierInstanceRef returns InstanceRef:
instance=[ComponentInstance] ( "." tail=HierInstanceRef)?
;
PropertyAssignmentRhs:
value=PropertyRvalueConstant |
instPropRef=InstancePropertyRef |
enumRef= [EnumDefinition]
"enum" enums=EnumBody |
elements=Concat
;
Concat:
'{' elements+=ConcatElem (',' elements+=ConcatElem)* '}'
;
ConcatElem:
instPropRef=InstancePropertyRef | value=NUM
;
enum PropertyEnum:
UNSPECIFIED |
NAME="name" |
DESC="desc" |
ARBITER="arbiter" |
RSET="rset" |
RCLR="rclr" |
WOCLR="woclr" |
WOSET="woset" |
WE="we" |
WEL="wel" |
SWWE="swwe" |
SWWEL="swwel" |
HWSET="hwset" |
HWCLR="hwclr" |
SWMOD="swmod" |
SWACC="swacc" |
STICKY="sticky" |
STICKYBIT="stickybit" |
INTR="intr" |
ANDED="anded" |
ORED="ored" |
XORED="xored" |
COUNTER="counter" |
OVERFLOW="overflow" |
SHAREDEXTBUS="sharedextbus" |
ERREXTBUS="errextbus" |
RESET="reset" |
LITTLEENDIAN="littleendian" |
BIGENDIAN="bigendian" |
RSVDSET="rsvdset" |
RSVDSETX="rsvdsetX" |
BRIDGE="bridge" |
SHARED="shared" |
MSB0="msb0" |
LSB0="lsb0" |
SYNC="sync" |
ASYNC="async" |
CPUIF_RESET="cpuif_reset" |
FIELD_RESET="field_reset" |
ACTIVEHIGH="activehigh" |
ACTIVELOW="activelow" |
SINGLEPULSE="singlepulse" |
UNDERFLOW="underflow" |
INCR="incr" |
DECR="decr" |
INCRWIDTH="incrwidth" |
DECRWIDTH="decrwidth" |
INCRVALUE="incrvalue" |
DECRVALUE="decrvalue" |
SATURATE="saturate" |
DECRSATURATE="decrsaturate" |
THRESHOLD="threshold" |
DECRTHRESHOLD="decrthreshold" |
DONTCOMPARE="dontcompare" |
DONTTEST="donttest" |
INTERNAL="internal" |
ALIGNMENT="alignment" |
REGWIDTH="regwidth" |
FIELDWIDTH="fieldwidth" |
SIGNALWIDTH="signalwidth" |
ACCESSWIDTH="accesswidth" |
SW="sw" |
HW="hw" |
ADDRESSING="addressing" |
PRECEDENCE="precedence" |
ENCODE="encode" |
RESETSIGNAL="resetsignal" |
CLOCK="clock" |
MASK="mask" |
ENABLE="enable" |
HWENABLE="hwenable" |
HWMASK="hwmask" |
HALTMASK="haltmask" |
HALTENABLE="haltenable" |
HALT="halt" |
NEXT="next"
;
enum Property returns PropertyEnum:
NAME="name" |
DESC="desc" |
ARBITER="arbiter" |
RSET="rset" |
RCLR="rclr" |
WOCLR="woclr" |
WOSET="woset" |
WE="we" |
WEL="wel" |
SWWE="swwe" |
SWWEL="swwel" |
HWSET="hwset" |
HWCLR="hwclr" |
SWMOD="swmod" |
SWACC="swacc" |
STICKY="sticky" |
STICKYBIT="stickybit" |
INTR="intr" |
ANDED="anded" |
ORED="ored" |
XORED="xored" |
COUNTER="counter" |
OVERFLOW="overflow" |
SHAREDEXTBUS="sharedextbus" |
ERREXTBUS="errextbus" |
RESET="reset" |
LITTLEENDIAN="littleendian" |
BIGENDIAN="bigendian" |
RSVDSET="rsvdset" |
RSVDSETX="rsvdsetX" |
BRIDGE="bridge" |
SHARED="shared" |
MSB0="msb0" |
LSB0="lsb0" |
SYNC="sync" |
ASYNC="async" |
CPUIF_RESET="cpuif_reset" |
FIELD_RESET="field_reset" |
ACTIVEHIGH="activehigh" |
ACTIVELOW="activelow" |
SINGLEPULSE="singlepulse" |
UNDERFLOW="underflow" |
INCR="incr" |
DECR="decr" |
INCRWIDTH="incrwidth" |
DECRWIDTH="decrwidth" |
INCRVALUE="incrvalue" |
DECRVALUE="decrvalue" |
SATURATE="saturate" |
DECRSATURATE="decrsaturate" |
THRESHOLD="threshold" |
DECRTHRESHOLD="decrthreshold" |
DONTCOMPARE="dontcompare" |
DONTTEST="donttest" |
INTERNAL="internal" |
ALIGNMENT="alignment" |
REGWIDTH="regwidth" |
FIELDWIDTH="fieldwidth" |
SIGNALWIDTH="signalwidth" |
ACCESSWIDTH="accesswidth" |
SW="sw" |
HW="hw" |
ADDRESSING="addressing" |
PRECEDENCE="precedence" |
ENCODE="encode" |
RESETSIGNAL="resetsignal" |
CLOCK="clock" |
MASK="mask" |
ENABLE="enable" |
HWENABLE="hwenable" |
HWMASK="hwmask" |
HALTMASK="haltmask" |
HALTENABLE="haltenable" |
HALT="halt" |
NEXT="next"
;
PropertyRvalueConstant returns RValue:
val=RValueConstant | num=NUM | str=STR
;
enum RValueConstant:
UNDEFINED | TRUE="true" | FALSE="false" | RW="rw" | WR="wr" | R="r" | W="w" | NA="na" | COMPACT="compact" | REGALIGN="regalign" | FULLALIGN="fullalign" | HW="hw" | SW="sw"
;
enum PropertyModifier:
UNDEFINED | POSEDGE="posedge" | NEGEDGE="negedge" | BOTHEDGE="bothedge" | LEVEL="level" | NONSTICKY="nonsticky"
;
EnumDefinition:
"enum" name=ID body=EnumBody
2017-09-12 12:48:21 +02:00
;
EnumBody:
'{' {EnumBody} entries+=EnumEntry* '}'
;
EnumEntry:
name=ID '=' index=NUM ('{' properties+=EnumProperty* '}')? ';'
;
EnumProperty:
( name='name' '=' value=STR | name='desc' '=' value=STR ) ';'
;
EnumInstanceType:
EXTERNAL="external" | INTERNAL="internal"
;
2017-09-12 12:48:21 +02:00
///////////////////////////////////////////////////////////////////////////////
// the terminals
///////////////////////////////////////////////////////////////////////////////
terminal ID:
'\\'? ('a'..'z'|'A'..'Z' | '_')('a'..'z'|'A'..'Z' | '_' | '0'..'9')*;
terminal WS : (' '|'\t'|'\r'|'\n')+;
terminal ML_COMMENT : '/*' -> '*/' ;
terminal SL_COMMENT : '//' !('\n'|'\r')* ('\r'? '\n')?;
terminal ESCAPE_JSP : '<%' -> '%>' ;
terminal ESCAPE_ORDL: '(' -> ')' ;
terminal NUM returns ecore::EJavaObject:
// <= verilog like numbers with size and base (16'123 'h1fff, ...====================================================================================> <= hexa decimal numbers =============> <numbers>
//'0'..'9'* '\'' ( 'b' ('0' | '1' | '_')+ | 'd'? ('0'..'9' | '_')+ | 'o' ('0'..'7' | '_')+ | 'h' ('0'..'9' | 'a'..'f' | 'A'..'F' | '_')+) | "0x" ('0'..'9' | 'a'..'f' | 'A'..'F')+ | '0'..'9'+;
'0'..'9'+ '\'b' ('0' | '1' | '_')+ |
'0'..'9'+ '\'o' ('0'..'7' | '_')+ |
'0'..'9'+ '\'h' ('0'..'9' | 'a'..'f' | 'A'..'F' | '_')+ |
'0'..'9'+ '\'d' ('0'..'9' | '_')+ |
'0x' ('0'..'9' | 'a'..'f' | 'A'..'F')+ |
'0'..'9'+
;
terminal STR:
'"' ( '\\' ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') | !('\\'|'"') )* '"' //|
// "'" ( '\\' ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') | !('\\'|"'") )* "'"
;