From 892563a59c8a1d7758b48f2eda9b0a4f51294567 Mon Sep 17 00:00:00 2001 From: Joe Kaushal Date: Thu, 5 Dec 2024 13:24:10 +0000 Subject: [PATCH] op2-translator: Add intrinsic type spec parameter support --- op2/include/op_f2c_prelude.h | 4 +-- .../fortran/translator/kernels_c.py | 32 ++++++++++++++++++- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/op2/include/op_f2c_prelude.h b/op2/include/op_f2c_prelude.h index 4402bfac8..9fcbd81e8 100644 --- a/op2/include/op_f2c_prelude.h +++ b/op2/include/op_f2c_prelude.h @@ -95,7 +95,7 @@ class Span { return Ptr{&elem, m_data.stride}; } - constexpr Slice splice(auto... es) const { + constexpr Slice slice(auto... es) const { static_assert(sizeof...(es) == N); return Slice(*this, es...); } @@ -105,8 +105,6 @@ class Span { return *this; } - constexpr Slice slice(auto... es) const { return Slice(*this, es...); } - template constexpr operator Ptr() const { return m_data; } }; diff --git a/translator/op2-translator/fortran/translator/kernels_c.py b/translator/op2-translator/fortran/translator/kernels_c.py index f23287b96..24a0e2488 100644 --- a/translator/op2-translator/fortran/translator/kernels_c.py +++ b/translator/op2-translator/fortran/translator/kernels_c.py @@ -333,7 +333,13 @@ def parseTypes(spec_part: f2003.Specification_Part, ctx: Context) -> Dict[str, F attr_array_spec = None if attr_spec_list is not None: - dimension_attr_spec = fpu.get_child(attr_spec_list, f2003.Dimension_Attr_Spec) + for attr_spec in attr_spec_list.items: + if isinstance(attr_spec, f2003.Dimension_Attr_Spec): + dimension_attr_spec = attr_spec + elif attr_spec.string == "PARAMETER" or isinstance(attr_spec, f2003.Intent_Attr_Spec): + continue + else: + ctx.error("Unexpected attr spec", attr_spec) if dimension_attr_spec is not None: attr_array_spec = parseArraySpec(dimension_attr_spec.items[1], ctx) @@ -638,6 +644,30 @@ def translateSpecificationPart(spec_part: f2003.Specification_Part, ctx: Context continue if isinstance(node, f2003.Type_Declaration_Stmt): + attr_spec_list = node.items[1] + + is_parameter = False + if attr_spec_list is not None: + for attr_spec in attr_spec_list.items: + if attr_spec.string == "PARAMETER": + is_parameter = True + + if not is_parameter: + continue + + for entity_decl in node.items[2].items: + name = translateGeneric(entity_decl.items[0], ctx) + + initialization = entity_decl.items[3] + if initialization is None: + ctx.error("Parameter has no initialization", entity_decl) + + if initialization.items[0] != "=": + ctx.error("Unsupported parameter initialization", initialization) + + val = translateGeneric(initialization.items[1], ctx) + parameters[name] = val + continue if isinstance(node, f2003.Data_Stmt):