Class: RubyRTL::ContextualAnalyzer

Inherits:
Visitor
  • Object
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.ios.each{|io| io.accept(self)}
    root.decls.each{|decl| decl.accept(self)}
    root.body.accept(self)
  end
end

#attachComments(body) ⇒ Object



52
53
54
# File 'lib/ruby_rtl/contextual_analyzer.rb', line 52

def attachComments body
  #niy
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) # dont forget to visit it
      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
  #reconnect Else/Elsifs objects to their parent If
  reconnectElseParts(body)
  #attach comments to their adequate Ast nodes
  attachComments(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=[] #helper
  puts " |-[+] visiting fsm '#{fsm.name}'"
  # default assignements
  fsm.default_assigns=fsm.body.select{|e| e.is_a? Assign}
  # build a state hash : state_name => state
  state_nodes=fsm.body.select{|e| e.is_a? State}
  # fsm.states=states_nodes.inject({}){|hash,state| hash.merge!( state.name=> state)}
  # build a state array
  fsm.states=state_nodes
  # don't forget to visit the states
  @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