Class: RubyRTL::SexpGenerator
Instance Method Summary
collapse
-
#generate(circuit) ⇒ Object
-
#visitAssign(assign, args = nil) ⇒ Object
-
#visitBinary(node, args = nil) ⇒ Object
expr ===.
-
#visitBody(body, args = nil) ⇒ Object
-
#visitCase(case_, args = nil) ⇒ Object
-
#visitEnumType(enum_type, args = nil) ⇒ Object
-
#visitFsm(fsm, args = nil) ⇒ Object
-
#visitFuncCall(func, args = nil) ⇒ Object
-
#visitIf(if_, args = nil) ⇒ Object
-
#visitIndexed(indexed, args = nil) ⇒ Object
-
#visitMemoryType(mem_type, args = nil) ⇒ Object
-
#visitNext(node, args = nil) ⇒ Object
-
#visitRecordType(rec_type, args = nil) ⇒ Object
-
#visitSigDecl(sig_decl, args = nil) ⇒ Object
-
#visitState(state, args = nil) ⇒ Object
-
#visitUnary(node, args = nil) ⇒ Object
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
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
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
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
|