Class: RubyRTL::SexpGenerator

Inherits:
DSLPrinter show all
Defined in:
lib/ruby_rtl/sexp_generator.rb

Instance Method Summary collapse

Methods inherited from DSLPrinter

#print, #visitBitLit, #visitBitType, #visitBitVectorType, #visitCombinatorial, #visitComment, #visitCompDecl, #visitElse, #visitElsif, #visitInput, #visitIntLit, #visitIntType, #visitLiteral, #visitOutput, #visitRIntLit, #visitRIntType, #visitRUIntLit, #visitRUintType, #visitSequential, #visitSig, #visitTypeDecl, #visitUIntLit, #visitUIntType

Methods inherited from Visitor

#visit, #visitBitLit, #visitBitType, #visitBitVectorType, #visitCircuitPart, #visitCombinatorial, #visitComment, #visitCompDecl, #visitElse, #visitElsif, #visitInput, #visitIntLit, #visitIntType, #visitInteger, #visitLiteral, #visitOutput, #visitPort, #visitRIntLit, #visitRIntType, #visitRUIntLit, #visitRUintType, #visitSequential, #visitSig, #visitType, #visitTypeDecl, #visitUIntLit, #visitUIntType, #visitWhen

Instance Method Details

#generate(circuit) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/ruby_rtl/sexp_generator.rb', line 7

def generate circuit
  puts "[+] S-exp code generation"
  root=circuit.ast
  code=Code.new
  code << "(circuit #{circuit.name}"
  code.indent=2
  root.decls.each{|decl| code << decl.accept(self)}
  code << root.body.accept(self)
  code.indent=0
  code << ")"
  puts code.finalize
end

#visitAssign(assign, args = nil) ⇒ Object



33
34
35
36
37
# File 'lib/ruby_rtl/sexp_generator.rb', line 33

def visitAssign assign,args=nil
  lhs=assign.lhs.accept(self)
  rhs=assign.rhs.accept(self)
  "(assign #{lhs} #{rhs})"
end

#visitBinary(node, args = nil) ⇒ Object

expr ===



80
81
82
83
84
85
# File 'lib/ruby_rtl/sexp_generator.rb', line 80

def visitBinary node,args=nil
  lhs=node.lhs.accept(self)
  op=node.op
  rhs=node.rhs.accept(self)
  "(#{op} #{lhs} #{rhs})"
end

#visitBody(body, args = nil) ⇒ Object

statements



27
28
29
30
31
# File 'lib/ruby_rtl/sexp_generator.rb', line 27

def visitBody body,args=nil
  code=Code.new
  body.each{|stmt| code << stmt.accept(self)}
  code
end

#visitCase(case_, args = nil) ⇒ Object



122
123
124
125
126
127
128
129
130
# File 'lib/ruby_rtl/sexp_generator.rb', line 122

def visitCase case_,args=nil
  code=Code.new
  code << "Case(){"
  code.indent=2
  code << case_.body.accept(self)
  code.indent=0
  code << "}"
  code
end

#visitEnumType(enum_type, args = nil) ⇒ Object



113
114
115
# File 'lib/ruby_rtl/sexp_generator.rb', line 113

def visitEnumType enum_type,args=nil
  "Enum(#{enum_type.items.join(",")})"
end

#visitFsm(fsm, args = nil) ⇒ Object

fsm



55
56
57
58
59
60
61
62
63
# File 'lib/ruby_rtl/sexp_generator.rb', line 55

def visitFsm fsm,args=nil
  code=Code.new
  code << "(fsm #{fsm.name}"
  code.indent=2
  fsm.states.each{|state| code << state.accept(self)}
  code.indent=0
  code << ")"
  code
end

#visitFuncCall(func, args = nil) ⇒ Object



92
93
94
95
96
# File 'lib/ruby_rtl/sexp_generator.rb', line 92

def visitFuncCall func,args=nil
  name=func.name
  argus=func.args.collect{|arg| arg.accept(self)}.join(" ")
  "(call #{name} #{argus})"
end

#visitIf(if_, args = nil) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/ruby_rtl/sexp_generator.rb', line 39

def visitIf if_,args=nil
  code=Code.new
  cond=if_.cond.accept(self)
  code << "(if #{cond}"
  code.indent=2
  code << "(then"
  code.indent=4
  code << if_.body.accept(self)
  code.indent=2
  code << ")"
  code.indent=0
  code << ")"
  code
end

#visitIndexed(indexed, args = nil) ⇒ Object



98
99
100
101
102
# File 'lib/ruby_rtl/sexp_generator.rb', line 98

def visitIndexed indexed,args=nil
  lhs=indexed.lhs.accept(self)
  rhs=indexed.rhs.accept(self)
  "(indexed #{lhs} #{rhs})"
end

#visitMemoryType(mem_type, args = nil) ⇒ Object



117
118
119
120
# File 'lib/ruby_rtl/sexp_generator.rb', line 117

def visitMemoryType mem_type,args=nil
  typename=mem_type.type
  "Memory(#{mem_type.size},#{typename})"
end

#visitNext(node, args = nil) ⇒ Object



75
76
77
# File 'lib/ruby_rtl/sexp_generator.rb', line 75

def visitNext node,args=nil
  "(next_state #{node.name})"
end

#visitRecordType(rec_type, args = nil) ⇒ Object



105
106
107
108
109
110
111
# File 'lib/ruby_rtl/sexp_generator.rb', line 105

def visitRecordType rec_type,args=nil
  items=[]
  rec_type.hash.each{|item,type|
    items << "#{item} => #{type}"
  }
  "Record(#{items.join(",")})"
end

#visitSigDecl(sig_decl, args = nil) ⇒ Object



20
21
22
23
24
# File 'lib/ruby_rtl/sexp_generator.rb', line 20

def visitSigDecl sig_decl,args=nil
  name=sig_decl.name
  type=sig_decl.sig.type.accept(self)
  "(input #{name} #{type})"
end

#visitState(state, args = nil) ⇒ Object



65
66
67
68
69
70
71
72
73
# File 'lib/ruby_rtl/sexp_generator.rb', line 65

def visitState state,args=nil
  code=Code.new
  code << "(state #{state.name}"
  code.indent=2
  code << state.body.accept(self)
  code.indent=0
  code << ")"
  code
end

#visitUnary(node, args = nil) ⇒ Object



87
88
89
90
# File 'lib/ruby_rtl/sexp_generator.rb', line 87

def visitUnary node,args=nil
  expr=node.expr.accept(self)
  "(#{node.op} #{expr})"
end