From 1a5a858030235b9205ee413603f43385431dcfab Mon Sep 17 00:00:00 2001 From: Anders Blomdell <anders.blomdell@control.lth.se> Date: Thu, 26 Feb 2015 17:41:18 +0100 Subject: [PATCH] Typedefs for python --- compiler/2014/Python_CodeGen.jrag | 21 ++++++++++----------- lib/python/labcomm/LabComm.py | 20 +++++++++++++++----- lib/python/labcomm/__init__.py | 1 + test/test_encoder_decoder.py | 9 +++++++-- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/compiler/2014/Python_CodeGen.jrag b/compiler/2014/Python_CodeGen.jrag index c454f92..68b9b95 100644 --- a/compiler/2014/Python_CodeGen.jrag +++ b/compiler/2014/Python_CodeGen.jrag @@ -84,13 +84,13 @@ aspect Python_CodeGen { env.println("import StringIO"); env.println(); Python_genTypes(env); - //env.println("typedef = ["); - //env.indent(); - //for (int i = 0 ; i < getNumDecl() ; i++) { - // getDecl(i).Python_genTypedefListEntry(env); - //} - //env.unindent(); - //env.println("]"); + env.println("typedef = tuple(["); + env.indent(); + for (int i = 0 ; i < getNumDecl() ; i++) { + getDecl(i).Python_genTypedefListEntry(env); + } + env.unindent(); + env.println("])"); env.println("sample = tuple(["); env.indent(); for (int i = 0 ; i < getNumDecl() ; i++) { @@ -117,7 +117,6 @@ aspect PythonTypes { } public void TypeDecl.Python_genSignature(Python_env env) { -/* env.println("class " + getName() + "(object):"); env.indent(); env.println("signature = labcomm.typedef('" + getName() + "',"); @@ -127,7 +126,6 @@ aspect PythonTypes { env.println(")"); env.unindent(); env.println(); -*/ } public void SampleDecl.Python_genSignature(Python_env env) { @@ -143,7 +141,8 @@ aspect PythonTypes { } public void UserType.Python_genSignature(Python_env env) { - lookupType(getName()).getType().Python_genSignature(env); + env.println(getName() + ".signature"); + // lookupType(getName()).getType().Python_genSignature(env); } public void Type.Python_genSignature(Python_env env) { @@ -204,7 +203,7 @@ aspect PythonTypes { } public void TypeDecl.Python_genTypedefListEntry(Python_env env) { - env.println("('" + getName() + "', " + getName() + ".signature),"); + env.println(getName() + ","); } public void Decl.Python_genSampleListEntry(Python_env env) { diff --git a/lib/python/labcomm/LabComm.py b/lib/python/labcomm/LabComm.py index 039d10b..208b92f 100644 --- a/lib/python/labcomm/LabComm.py +++ b/lib/python/labcomm/LabComm.py @@ -389,7 +389,7 @@ class SAMPLE(primitive): # # Aggregate types # -class sample_def_or_ref(type_decl): +class sampledef_or_sampleref_or_typedef(type_decl): def __init__(self, name=None, decl=None): self.name = name self.decl = decl @@ -402,8 +402,8 @@ class sample_def_or_ref(type_decl): with length_encoder(e1) as e2: self.decl.encode_decl(e2) - def encode(self, encoder, object): - self.decl.encode(encoder, object) + def encode(self, encoder, value): + self.decl.encode(encoder, value) def decode_decl(self, decoder): index = decoder.decode_type_number() @@ -438,7 +438,7 @@ class sample_def_or_ref(type_decl): def __repr__(self): return "%s('%s', %s)" % (self.type_name, self.name, self.decl) -class sample_def(sample_def_or_ref): +class sample_def(sampledef_or_sampleref_or_typedef): type_index = i_SAMPLE_DEF type_name = 'sample' @@ -448,7 +448,7 @@ class sample_def(sample_def_or_ref): def add_index(self, decoder, index, decl): decoder.add_decl(decl, index) -class sample_ref(sample_def_or_ref): +class sample_ref(sampledef_or_sampleref_or_typedef): type_index = i_SAMPLE_REF type_name = 'sample_ref' @@ -466,6 +466,16 @@ class sample_ref(sample_def_or_ref): def add_index(self, decoder, index, decl): decoder.add_ref(decl, index) +class typedef(sampledef_or_sampleref_or_typedef): + type_index = i_TYPE_DEF + type_name = 'typedef' + + def encode_decl(self, encoder): + self.decl.encode_decl(encoder) + + def encode(self, encoder, value): + self.decl.encode(encoder, value) + class array(type_decl): def __init__(self, indices, decl): self.indices = tuple(indices) diff --git a/lib/python/labcomm/__init__.py b/lib/python/labcomm/__init__.py index 0c95e1d..fb2c085 100644 --- a/lib/python/labcomm/__init__.py +++ b/lib/python/labcomm/__init__.py @@ -9,6 +9,7 @@ Encoder = labcomm.LabComm.Encoder sample = labcomm.LabComm.sample_def sample_def = labcomm.LabComm.sample_def sample_ref = labcomm.LabComm.sample_ref +typedef = labcomm.LabComm.typedef array = labcomm.LabComm.array struct = labcomm.LabComm.struct diff --git a/test/test_encoder_decoder.py b/test/test_encoder_decoder.py index 08a0c96..29960cb 100755 --- a/test/test_encoder_decoder.py +++ b/test/test_encoder_decoder.py @@ -53,6 +53,12 @@ class Test: result.append((decl, values)) return result + elif decl.__class__ == labcomm.typedef: + result = [] + for values in self.generate(decl.decl): + result.append(values) + return result + elif decl.__class__ == labcomm.struct: result = [] if len(decl.field) == 0: @@ -164,7 +170,6 @@ class Test: print>>sys.stderr, "Checking", signature.name, for decl,value in self.generate(signature): sys.stderr.write('.') - #print name,decl,value,value.__class__ self.next.acquire() self.received_value = None self.received_decl = None @@ -176,7 +181,7 @@ class Test: self.failed = True elif value != self.received_value: print>>sys.stderr, "Coding error" - print>>sys.stderr,value == self.received_value + print>>sys.stderr, value == self.received_value print>>sys.stderr, "Got: ", self.received_value print>>sys.stderr, " ", self.received_decl print>>sys.stderr, "Expected:", value -- GitLab