Class: RubyRTL::ContextualAnalyzer
- Inherits:
-
Visitor
- Object
- Visitor
- RubyRTL::ContextualAnalyzer
show all
- Defined in:
- lib/ruby_rtl/contextual_analyzer.rb
Instance Method Summary
collapse
Methods inherited from Visitor
#visit, #visitBinary, #visitBitLit, #visitBitType, #visitBitVectorType, #visitCase, #visitCircuitPart, #visitCombinatorial, #visitComment, #visitCompDecl, #visitElse, #visitElsif, #visitIf, #visitIndexed, #visitInput, #visitIntLit, #visitIntType, #visitInteger, #visitLiteral, #visitNext, #visitOutput, #visitPort, #visitRIntLit, #visitRIntType, #visitRUIntLit, #visitRUintType, #visitRecordType, #visitSequential, #visitSig, #visitSigDecl, #visitType, #visitTypeDecl, #visitUIntLit, #visitUIntType, #visitUnary, #visitWhen
Instance Method Details
#analyze(circuit) ⇒ Object
8
9
10
11
12
13
14
15
16
|
# File 'lib/ruby_rtl/contextual_analyzer.rb', line 8
def analyze circuit
puts "[+] contextual analysis"
root=circuit.ast
if root
root.decls.each{|decl| decl.accept(self)}
root.body.accept(self)
end
end
|
52
53
54
|
# File 'lib/ruby_rtl/contextual_analyzer.rb', line 52
def body
end
|
#reconnectElseParts(body) ⇒ Object
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
# File 'lib/ruby_rtl/contextual_analyzer.rb', line 26
def reconnectElseParts body
ifs=body.select{|stmt| stmt.is_a? If}
to_delete=[]
ifs.each do |if_|
index_if=body.stmts.index(if_)
do_iterate=true
index=index_if
while do_iterate
case elsei=body.stmts[index+1]
when Else
if_.else=elsei
to_delete << elsei
elsei.accept(self)
when Elsif
if_.elsifs << elsei
to_delete << elsei
elsei.accept(self)
else
do_iterate=false
end
index+=1
end
end
to_delete.each{|stmt| body.stmts.delete(stmt)}
end
|
#visitAssign(assign, args = nil) ⇒ Object
77
78
79
80
81
82
83
84
85
|
# File 'lib/ruby_rtl/contextual_analyzer.rb', line 77
def visitAssign assign,args=nil
if @in_state
puts "pushing #{assign}"
unless @tmp_ary.include?(id=assign.lhs.object_id)
@tmp_ary << id
@fsm.assignments << assign
end
end
end
|
#visitBody(body, args = nil) ⇒ Object
18
19
20
21
22
23
24
|
# File 'lib/ruby_rtl/contextual_analyzer.rb', line 18
def visitBody body,args=nil
reconnectElseParts(body)
(body)
body.stmts.each{|stmt| stmt.accept(self,args)}
end
|
#visitFsm(fsm, args = nil) ⇒ Object
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
# File 'lib/ruby_rtl/contextual_analyzer.rb', line 56
def visitFsm fsm,args=nil
@fsm=fsm
@tmp_ary=[]
puts " |-[+] visiting fsm '#{fsm.name}'"
fsm.default_assigns=fsm.body.select{|e| e.is_a? Assign}
state_nodes=fsm.body.select{|e| e.is_a? State}
fsm.states=state_nodes
@in_state=true
fsm.states.each{|state| state.accept(self)}
@in_state=false
end
|
#visitState(state, args = nil) ⇒ Object
73
74
75
|
# File 'lib/ruby_rtl/contextual_analyzer.rb', line 73
def visitState state,args=nil
state.body.accept(self)
end
|