vhdl_tb 0.6.5 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/lib/compiler.rb +3 -1
- data/lib/generic_lexer.rb +2 -2
- data/lib/lexer.rb +140 -37
- data/lib/parser.rb +29 -18
- data/lib/token.rb +4 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 60412d4e16c8f944834bc400eea61eb617c2006713e12125a51c38f15ffc39af
|
4
|
+
data.tar.gz: 9a35251fc2315d50c88fb29d0e0ffd7be194db91cce91bc2af1937122f5f0a30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dcaaae2c60bf8c91536c9e8a5c8f6f2c5ec7a57728dcbeb338b11300247f96bdd708c8609bb65b7932bd5c1936cdb026c0c3f04cae9146c327e71640eac158e
|
7
|
+
data.tar.gz: '0229d739111e76d6523876542dde9c0017d154725c6177116d15d5ca86ee77c8a832526d59de64a7550cba467a8c8d90fdf6e7ed985bffd3662ec9dd55fbc8d5'
|
data/lib/compiler.rb
CHANGED
@@ -11,7 +11,7 @@ module VHDL_TB
|
|
11
11
|
|
12
12
|
class Compiler
|
13
13
|
|
14
|
-
VERSION = "0.
|
14
|
+
VERSION = "0.7.0"
|
15
15
|
|
16
16
|
def initialize
|
17
17
|
#puts __dir__
|
@@ -68,6 +68,7 @@ module VHDL_TB
|
|
68
68
|
File.open(tb_filename,'w'){|f| f.puts tb_txt}
|
69
69
|
puts "testbench generated : #{tb_filename}"
|
70
70
|
rescue Exception => e
|
71
|
+
puts e
|
71
72
|
abort
|
72
73
|
end
|
73
74
|
end
|
@@ -77,6 +78,7 @@ module VHDL_TB
|
|
77
78
|
|
78
79
|
root=Parser.new.parse entity_filename
|
79
80
|
|
81
|
+
#puts "parsed #{entity_filename}. Good."
|
80
82
|
@entity=root.design_units.find{|du| du.class==Entity}
|
81
83
|
puts "entity found : #{@entity.name} (#{@entity.ports.size} ports)"
|
82
84
|
|
data/lib/generic_lexer.rb
CHANGED
@@ -14,7 +14,7 @@ class GenericLexer
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def keyword str
|
17
|
-
@rules.unshift [str.to_sym,/#{str}\b/]
|
17
|
+
@rules.unshift [str.to_sym,/#{str}\b/i]
|
18
18
|
end
|
19
19
|
|
20
20
|
def token hash
|
@@ -56,7 +56,7 @@ class GenericLexer
|
|
56
56
|
tokens << next_token() while not @ssc.eos?
|
57
57
|
# while not @ssc.eos?
|
58
58
|
# tokens << (p next_token)
|
59
|
-
# end
|
59
|
+
# end #usefull for debug
|
60
60
|
tokens
|
61
61
|
end
|
62
62
|
end
|
data/lib/lexer.rb
CHANGED
@@ -1,42 +1,145 @@
|
|
1
1
|
require_relative 'generic_lexer'
|
2
|
+
require_relative 'generic_parser'
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
module VHDL_TB
|
5
|
+
class Lexer < GenericLexer
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
keyword 'abs'
|
9
|
+
keyword 'access'
|
10
|
+
keyword 'after'
|
11
|
+
keyword 'alias'
|
12
|
+
keyword 'all'
|
13
|
+
keyword 'and'
|
14
|
+
keyword 'architecture'
|
15
|
+
keyword 'array'
|
16
|
+
keyword 'assert'
|
17
|
+
keyword 'attribute'
|
18
|
+
keyword 'begin'
|
19
|
+
keyword 'block'
|
20
|
+
keyword 'body'
|
21
|
+
keyword 'buffer'
|
22
|
+
keyword 'bus'
|
23
|
+
keyword 'case'
|
24
|
+
keyword 'component'
|
25
|
+
keyword 'configuration'
|
26
|
+
keyword 'constant'
|
27
|
+
keyword 'disconnect'
|
28
|
+
keyword 'downto'
|
29
|
+
keyword 'else'
|
30
|
+
keyword 'elsif'
|
31
|
+
keyword 'end'
|
32
|
+
keyword 'entity'
|
33
|
+
keyword 'exit'
|
34
|
+
keyword 'file'
|
35
|
+
keyword 'for'
|
36
|
+
keyword 'function'
|
37
|
+
keyword 'generate'
|
38
|
+
keyword 'generic'
|
39
|
+
keyword 'group'
|
40
|
+
keyword 'guarded'
|
41
|
+
keyword 'if'
|
42
|
+
keyword 'impure'
|
43
|
+
keyword 'inertial'
|
44
|
+
keyword 'inout'
|
45
|
+
keyword 'in'
|
46
|
+
keyword 'is'
|
47
|
+
keyword 'label'
|
48
|
+
keyword 'library'
|
49
|
+
keyword 'linkage'
|
50
|
+
keyword 'literal'
|
51
|
+
keyword 'loop'
|
52
|
+
keyword 'map'
|
53
|
+
keyword 'mod'
|
54
|
+
keyword 'nand'
|
55
|
+
keyword 'natural'
|
56
|
+
keyword 'integer'
|
57
|
+
keyword 'boolean'
|
58
|
+
keyword 'positive'
|
59
|
+
keyword 'new'
|
60
|
+
keyword 'next'
|
61
|
+
keyword 'nor'
|
62
|
+
keyword 'not'
|
63
|
+
keyword 'null'
|
64
|
+
keyword 'of'
|
65
|
+
keyword 'on'
|
66
|
+
keyword 'open'
|
67
|
+
keyword 'or'
|
68
|
+
keyword 'others'
|
69
|
+
keyword 'out'
|
70
|
+
keyword 'package'
|
71
|
+
keyword 'port'
|
72
|
+
keyword 'postponed'
|
73
|
+
keyword 'procedure'
|
74
|
+
keyword 'process'
|
75
|
+
keyword 'pure'
|
76
|
+
keyword 'range'
|
77
|
+
keyword 'record'
|
78
|
+
keyword 'register'
|
79
|
+
keyword 'reject'
|
80
|
+
keyword 'report'
|
81
|
+
keyword 'return'
|
82
|
+
keyword 'rol'
|
83
|
+
keyword 'ror'
|
84
|
+
keyword 'select'
|
85
|
+
keyword 'severity'
|
86
|
+
keyword 'signal'
|
87
|
+
keyword 'shared'
|
88
|
+
keyword 'sla'
|
89
|
+
keyword 'sli'
|
90
|
+
keyword 'sra'
|
91
|
+
keyword 'srl'
|
92
|
+
keyword 'subtype'
|
93
|
+
keyword 'then'
|
94
|
+
keyword 'to'
|
95
|
+
keyword 'transport'
|
96
|
+
keyword 'type'
|
97
|
+
keyword 'unaffected'
|
98
|
+
keyword 'units'
|
99
|
+
keyword 'until'
|
100
|
+
keyword 'use'
|
101
|
+
keyword 'variable'
|
102
|
+
keyword 'wait'
|
103
|
+
keyword 'when'
|
104
|
+
keyword 'while'
|
105
|
+
keyword 'with'
|
106
|
+
keyword 'xnor'
|
107
|
+
keyword 'xorkeyword '
|
7
108
|
|
8
|
-
|
9
|
-
|
109
|
+
#.............................................................
|
110
|
+
token :comments => /\A\-\-(.*)$/
|
111
|
+
token :selected_name => /\w+(\.\w+)+/ # /\S+\w+\.\w+/
|
112
|
+
token :identifier => /[a-zA-Z]\w*/
|
10
113
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
114
|
+
token :string_literal => /"[^"]*"/
|
115
|
+
token :char_literal => /'(\w+)'/
|
116
|
+
token :attribute_literal => /'(\w+)/
|
117
|
+
token :decimal_literal => /\d+(\.\d+)?(E([+-]?)\d+)?/
|
118
|
+
token :based_literal => /\d+#\w+(\.\w+)?#(E[+-]?\d+)/
|
119
|
+
token :bit_string_literal => /(b|o|x)"[^_]\w+"/
|
120
|
+
token :vassign => /\A\:\=/
|
121
|
+
token :comma => /\A\,/
|
122
|
+
token :colon => /\A\:/
|
123
|
+
token :semicolon => /\A\;/
|
124
|
+
token :lparen => /\A\(/
|
125
|
+
token :rparen => /\A\)/
|
126
|
+
token :plus => /\A\+/
|
127
|
+
token :minus => /\A\-/
|
128
|
+
token :times => /\A\*/
|
23
129
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
token :str_lit => /\"(.*)\"/
|
41
|
-
end
|
42
|
-
end
|
130
|
+
token :sassign => /\A\<\=/
|
131
|
+
token :imply => /\A\=\>/
|
132
|
+
token :eq => /\A\=/
|
133
|
+
token :ampersand => /\A\&/
|
134
|
+
token :neq => /\A\/\=/
|
135
|
+
token :gte => /\A\>\=/
|
136
|
+
token :gt => /\A\>/
|
137
|
+
token :lt => /\A\</
|
138
|
+
token :urange => /\A<>/
|
139
|
+
#............................................................
|
140
|
+
token :newline => /[\n]/
|
141
|
+
token :space => /[ \t\r]+/
|
142
|
+
|
143
|
+
end #def
|
144
|
+
end #class
|
145
|
+
end #module
|
data/lib/parser.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require_relative 'generic_parser'
|
2
3
|
require_relative 'ast'
|
3
4
|
require_relative 'lexer'
|
@@ -11,20 +12,27 @@ module VHDL_TB
|
|
11
12
|
attr_accessor :basename,:filename
|
12
13
|
|
13
14
|
def initialize
|
15
|
+
#@verbose=true
|
14
16
|
@lexer=Lexer.new
|
15
17
|
end
|
16
18
|
|
17
|
-
def
|
18
|
-
|
19
|
+
def lex filename
|
20
|
+
unless File.exists?(filename)
|
21
|
+
raise "ERROR : cannot find file '#{filename}'"
|
22
|
+
end
|
19
23
|
begin
|
20
|
-
|
21
|
-
|
22
|
-
|
24
|
+
str=IO.read(filename)
|
25
|
+
tokens=lexer.tokenize(str)
|
26
|
+
tokens=tokens.select{|t| t.class==Token} # filters [nil,nil,nil]
|
27
|
+
return tokens.reject{|tok| tok.is_a? [:comment,:newline,:space]}
|
23
28
|
rescue Exception=>e
|
24
|
-
puts e
|
25
29
|
puts "an error occured during LEXICAL analysis. Sorry. Aborting."
|
26
30
|
raise
|
27
31
|
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse filename
|
35
|
+
@tokens=lex(filename)
|
28
36
|
root=Root.new([])
|
29
37
|
begin
|
30
38
|
consume_to :entity
|
@@ -34,7 +42,7 @@ module VHDL_TB
|
|
34
42
|
root.design_units << archi=parse_architecture
|
35
43
|
|
36
44
|
rescue Exception => e
|
37
|
-
|
45
|
+
puts e.backtrace
|
38
46
|
puts e
|
39
47
|
puts "an error occured during SYNTACTIC analysis (around line #{showNext.pos.first}). Sorry. Aborting."
|
40
48
|
raise
|
@@ -54,7 +62,7 @@ module VHDL_TB
|
|
54
62
|
def parse_entity
|
55
63
|
entity=Entity.new(nil,nil,[])
|
56
64
|
expect :entity
|
57
|
-
entity.name=expect :
|
65
|
+
entity.name=expect :identifier
|
58
66
|
expect :is
|
59
67
|
if showNext.is_a? :generic
|
60
68
|
entity.generics=parse_generics
|
@@ -63,6 +71,9 @@ module VHDL_TB
|
|
63
71
|
entity.ports=parse_ports
|
64
72
|
end
|
65
73
|
expect :end
|
74
|
+
if showNext.is_a? :semicolon
|
75
|
+
acceptIt
|
76
|
+
end
|
66
77
|
return entity
|
67
78
|
end
|
68
79
|
|
@@ -84,10 +95,10 @@ module VHDL_TB
|
|
84
95
|
|
85
96
|
def parse_generic
|
86
97
|
ids=[]
|
87
|
-
ids << expect(:
|
98
|
+
ids << expect(:identifier)
|
88
99
|
while showNext.is_a? :comma
|
89
100
|
acceptIt
|
90
|
-
ids << expect(:
|
101
|
+
ids << expect(:identifier)
|
91
102
|
end
|
92
103
|
expect :colon
|
93
104
|
type=parse_type
|
@@ -116,10 +127,10 @@ module VHDL_TB
|
|
116
127
|
|
117
128
|
def parse_io
|
118
129
|
ids=[]
|
119
|
-
ids << expect(:
|
130
|
+
ids << expect(:identifier)
|
120
131
|
while showNext.is_a? :comma
|
121
132
|
acceptIt
|
122
|
-
ids << expect(:
|
133
|
+
ids << expect(:identifier)
|
123
134
|
end
|
124
135
|
expect :colon
|
125
136
|
if showNext.is_a? [:in,:out]
|
@@ -132,7 +143,7 @@ module VHDL_TB
|
|
132
143
|
|
133
144
|
def parse_type
|
134
145
|
type=Identifier.new
|
135
|
-
type.tok=expect(:
|
146
|
+
type.tok=expect(:identifier)
|
136
147
|
if showNext.is_a? :lparen
|
137
148
|
acceptIt
|
138
149
|
name=type.tok
|
@@ -153,11 +164,11 @@ module VHDL_TB
|
|
153
164
|
end
|
154
165
|
|
155
166
|
def parse_term
|
156
|
-
if showNext.is_a? [:
|
167
|
+
if showNext.is_a? [:decimal_literal,:identifier]
|
157
168
|
case showNext.kind
|
158
|
-
when :
|
169
|
+
when :decimal_literal
|
159
170
|
return IntLit.new(acceptIt)
|
160
|
-
when :
|
171
|
+
when :identifier
|
161
172
|
return Identifier.new(acceptIt)
|
162
173
|
else
|
163
174
|
puts "cannot parse term"
|
@@ -168,9 +179,9 @@ module VHDL_TB
|
|
168
179
|
def parse_architecture
|
169
180
|
archi=Architecture.new
|
170
181
|
expect :architecture
|
171
|
-
archi.name=expect(:
|
182
|
+
archi.name=expect(:identifier)
|
172
183
|
expect :of
|
173
|
-
archi.entity=expect(:
|
184
|
+
archi.entity=expect(:identifier)
|
174
185
|
archi
|
175
186
|
end
|
176
187
|
end
|
data/lib/token.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vhdl_tb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean-Christophe Le Lann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A simple testbench generator for VHDL
|
14
14
|
email: jean-christophe.le_lann@ensta-bretagne.fr
|
@@ -49,7 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
49
49
|
version: '0'
|
50
50
|
requirements: []
|
51
51
|
rubyforge_project:
|
52
|
-
rubygems_version: 2.
|
52
|
+
rubygems_version: 2.7.7
|
53
53
|
signing_key:
|
54
54
|
specification_version: 4
|
55
55
|
summary: VHDL Testbench generator
|