EnqueueStatementAST.py (9508:dde110931867) EnqueueStatementAST.py (10155:3b0bcc8c34ca)
1# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
2# Copyright (c) 2009 The Hewlett-Packard Development Company
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions are
7# met: redistributions of source code must retain the above copyright
8# notice, this list of conditions and the following disclaimer;

--- 15 unchanged lines hidden (view full) ---

24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28from slicc.ast.StatementAST import StatementAST
29from slicc.symbols import Var
30
31class EnqueueStatementAST(StatementAST):
1# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
2# Copyright (c) 2009 The Hewlett-Packard Development Company
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions are
7# met: redistributions of source code must retain the above copyright
8# notice, this list of conditions and the following disclaimer;

--- 15 unchanged lines hidden (view full) ---

24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28from slicc.ast.StatementAST import StatementAST
29from slicc.symbols import Var
30
31class EnqueueStatementAST(StatementAST):
32 def __init__(self, slicc, queue_name, type_ast, pairs, statements):
33 super(EnqueueStatementAST, self).__init__(slicc, pairs)
32 def __init__(self, slicc, queue_name, type_ast, lexpr, statements):
33 super(EnqueueStatementAST, self).__init__(slicc)
34
35 self.queue_name = queue_name
36 self.type_ast = type_ast
34
35 self.queue_name = queue_name
36 self.type_ast = type_ast
37 self.latexpr = lexpr
37 self.statements = statements
38
39 def __repr__(self):
40 return "[EnqueueStatementAst: %s %s %s]" % \
41 (self.queue_name, self.type_ast.ident, self.statements)
42
43 def generate(self, code, return_type):
44 code("{")

--- 8 unchanged lines hidden (view full) ---

53 self.symtab.newSymbol(v)
54
55 # Declare message
56 code("${{msg_type.ident}} *out_msg = "\
57 "new ${{msg_type.ident}}(clockEdge());")
58
59 # The other statements
60 t = self.statements.generate(code, None)
38 self.statements = statements
39
40 def __repr__(self):
41 return "[EnqueueStatementAst: %s %s %s]" % \
42 (self.queue_name, self.type_ast.ident, self.statements)
43
44 def generate(self, code, return_type):
45 code("{")

--- 8 unchanged lines hidden (view full) ---

54 self.symtab.newSymbol(v)
55
56 # Declare message
57 code("${{msg_type.ident}} *out_msg = "\
58 "new ${{msg_type.ident}}(clockEdge());")
59
60 # The other statements
61 t = self.statements.generate(code, None)
61
62 self.queue_name.assertType("OutPort")
63
62 self.queue_name.assertType("OutPort")
63
64 args = [ "out_msg" ]
65 if "latency" in self:
66 latency = self["latency"]
67 try:
68 # see if this is an integer
69 latency = int(latency)
70 args.append("Cycles(%s)" % latency)
71 except ValueError:
72 # if not, it should be a member
73 args.append("m_%s" % latency)
64 if self.latexpr != None:
65 ret_type, rcode = self.latexpr.inline(True)
66 code("(${{self.queue_name.var.code}}).enqueue(" \
67 "out_msg, Cycles($rcode));")
68 else:
69 code("(${{self.queue_name.var.code}}).enqueue(out_msg);")
74
70
75 args = ", ".join(args)
76 code('(${{self.queue_name.var.code}}).enqueue($args);')
77
78
79 # End scope
80 self.symtab.popFrame()
81 code.dedent()
82 code("}")
83
84 def findResources(self, resources):
85 var = self.queue_name.var
86 res_count = int(resources.get(var, 0))
87 resources[var] = str(res_count + 1)
71 # End scope
72 self.symtab.popFrame()
73 code.dedent()
74 code("}")
75
76 def findResources(self, resources):
77 var = self.queue_name.var
78 res_count = int(resources.get(var, 0))
79 resources[var] = str(res_count + 1)