Skip to content

Added cpp2 code generator #254

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 55 additions & 20 deletions src/pycropml/cyml.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,20 +24,53 @@
from pycropml.topology import Topology
from pycropml.code2nbk import Model2Nb
from pycropml.transpiler.generators.pythonGenerator import PythonSimulation
from pycropml.transpiler.generators.siriusGenerator import to_struct_sirius,to_wrapper_sirius
from pycropml.transpiler.generators.sirius2Generator import to_struct_sirius2,to_wrapper_sirius2
from pycropml.transpiler.generators.siriusGenerator import to_struct_sirius, to_wrapper_sirius
from pycropml.transpiler.generators.sirius2Generator import to_struct_sirius2, to_wrapper_sirius2
from pycropml.transpiler.generators.recordGenerator import Crop2ML_Vpz
from pycropml.transpiler.generators.cppGenerator import to_struct_cpp
import pycropml.transpiler.antlr_py


NAMES = {'r':'r','cs':'csharp','cpp':'cpp', 'py':'python', 'f90':'fortran', 'java':'java', 'simplace':'simplace', 'sirius':'sirius', "openalea":"openalea","apsim":"apsim", "record":"record", "dssat":"dssat","bioma":"bioma", "stics":"stics", "sirius2":"sirius2"}
ext = {'r':'r','cs':'cs','cpp':'cpp', 'py':'py', 'f90':'f90', 'java':'java', 'simplace':'java', 'sirius':'cs','bioma':'cs', "openalea":"py", "apsim":"cs", "record":"cpp", "dssat":"f90", "stics":"f90", "sirius2":'cs'}
#from pycropml.transpiler.generators.cppGenerator import to_struct_cpp
import pycropml.transpiler.antlr_py

NAMES = {
'r': 'r',
'cs': 'csharp',
'cpp': 'cpp',
"cpp2": "cpp2",
'py': 'python',
'f90': 'fortran',
'java': 'java',
'simplace': 'simplace',
'sirius': 'sirius',
"openalea": "openalea",
"apsim": "apsim",
"record": "record",
"dssat": "dssat",
"bioma": "bioma",
"stics": "stics",
"sirius2": "sirius2"
}

ext = {'r': 'r',
'cs': 'cs',
'cpp': 'cpp',
"cpp2": "cpp",
'py': 'py',
'f90': 'f90',
'java': 'java',
'simplace': 'java',
'sirius': 'cs',
'bioma': 'cs',
"openalea": "py",
"apsim": "cs",
"record": "cpp",
"dssat": "f90",
"stics": "f90",
"sirius2": 'cs'
}

cymltx_languages = ['dssat', "simplace", "bioma", "openalea", "f90", "stics", "py"]
langs = ["cs", "cpp", "java", "f90", "r", "py"]

domain_class = ["cs", "java", 'sirius','cpp', "bioma", "sirius2", "apsim"]
domain_class = ["cs", "java", "sirius", "cpp", "cpp2", "bioma", "sirius2", "apsim"]
wrapper=["cs", "sirius", "bioma", "sirius2", "apsim"]
platform = ["simplace","sirius","openalea","apsim","bioma","record","dssat", "stics", "sirius2"]

Expand Down Expand Up @@ -79,7 +112,7 @@ def transpile_package(package, language):
dir_test.mkdir()
if not isdir(dir_doc):
dir_doc.mkdir()

dir_images = Path(os.path.join(dir_doc, 'images'))
if not isdir(dir_images):
dir_images.mkdir()
Expand All @@ -91,8 +124,8 @@ def transpile_package(package, language):

if not isdir(tg_rep1):
tg_rep1.mkdir()
namep_ = namep.replace("-", "_")

namep_ = namep.replace("-", "_")
tg_rep = Path(os.path.join(tg_rep1, namep_))
if not isdir(tg_rep):
tg_rep.mkdir()
Expand All @@ -110,9 +143,9 @@ def transpile_package(package, language):
mc_name = T.model.name

# Record VPZ
#if language == "record":
#vpz = Crop2ML_Vpz(T)
#print(vpz.create())
# if language == "record":
# vpz = Crop2ML_Vpz(T)
# print(vpz.create())

# domain class
if language in domain_class:
Expand All @@ -134,24 +167,25 @@ def transpile_package(package, language):
test.parse()
test.to_ast(source)
code = test.to_source()
filename = Path(os.path.join(tg_rep, f"{nameconvention.signature(model, ext[language])}.{ext[language]}"))
filename = Path(
os.path.join(tg_rep, f"{nameconvention.signature(model, ext[language])}.{ext[language]}"))
with open(filename, "wb") as tg_file:
tg_file.write(code.encode('utf-8'))
if language in langs:
Model2Nb(model, code, name, dir_test_lang).generate_nb(language, tg_rep, namep, mc_name)
#code2nbk.generate_notebook(code, name, dir_nb_lang)
# code2nbk.generate_notebook(code, name, dir_nb_lang)

# Create Cyml Composite model
T_pyx = T.algo2cyml(dir_images)
fileT = Path(os.path.join(cyml_rep, f"{mc_name}Component.pyx"))
with open(fileT, "wb") as tg_file:
tg_file.write(T_pyx.encode('utf-8'))
tg_file.write(T_pyx.encode('utf-8'))

filename = Path(os.path.join(tg_rep, f"{mc_name}Component.{ext[language]}"))
code = T.compotranslate(language).encode('utf-8')
if code:
with open(filename, "wb") as tg_file:
tg_file.write(code)
tg_file.write(code)

# create computing algorithm
if language == "py":
Expand Down Expand Up @@ -191,7 +225,8 @@ def transpile_component(component, package, language):
"""

translator = {
format: getattr(getattr(getattr(pycropml.transpiler.antlr_py, NAMES[format].lower()), 'run'), f'run_{NAMES[format]}')
format: getattr(getattr(getattr(pycropml.transpiler.antlr_py, NAMES[format].lower()), 'run'),
f'run_{NAMES[format]}')
for format in cymltx_languages
}
print('translator :', translator)
Expand Down
35 changes: 16 additions & 19 deletions src/pycropml/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,8 @@

from pycropml.transpiler.main import languages

def main():


def main():
usage = """Usage: %prog [options] package language1 [languages]

cyml transpiler translate a cyml source code or a Crop2ML package with algo in cyml
Expand All @@ -41,7 +40,7 @@ def main():
apsim, bioma, dssat, openalea, record, simplace, stics

"""
#TODO
# TODO
todo = """
* target language must be:
py for python
Expand All @@ -56,18 +55,17 @@ def main():

parser = OptionParser(usage=usage)


parser.add_option("-f", "--file", dest="file", metavar="FILE",
help="cyml source code FILE to transpile")
help="cyml source code FILE to transpile")
parser.add_option("-p", "--package", dest="package",
help="package directory containing a crop2ml directory with algorithms.")
help="package directory containing a crop2ml directory with algorithms.")
parser.add_option("-c", "--component", dest="component",
help="framework model component directory")
help="framework model component directory")
parser.add_option("-l", "--languages", dest="languages", action="append",
choices=languages,
help="Target languages : "+','.join(languages))
choices=languages,
help="Target languages : " + ','.join(languages))

(opts, args)= parser.parse_args()
(opts, args) = parser.parse_args()

sourcef = None
pyx_filename = None
Expand All @@ -86,10 +84,11 @@ def main():
elif opts.component:
sourcef = component = opts.component
else:
if len(args)==0:
if len(args) == 0:
parser.print_usage()
return
else: sourcef = args[0]
else:
sourcef = args[0]

sourcef = Path(sourcef)
if not sourcef.exists():
Expand All @@ -99,16 +98,16 @@ def main():
langs = opts.languages
else:
if opts.component:
newpackage = args[0]
args = args[1:]
newpackage = args[0]
args = args[1:]
langs = [a for a in args if a in languages]

fail = False
for arg in args:
if arg == sourcef:
continue
if arg not in languages:
parser.error("%s is not a supported language"%arg)
parser.error("%s is not a supported language" % arg)
fail = True

if fail:
Expand All @@ -119,11 +118,10 @@ def main():
print(parser.usage)
return


if pyx_filename or len(sourcef.split(".")) == 2:
# translate from cyml code
if sourcef.split(".")[1] != "pyx":
parser.error("Source code %s is not a Cyml file (.pyx estension) "%(str(sourcef)))
parser.error("Source code %s is not a Cyml file (.pyx estension) " % (str(sourcef)))
return

for language in langs:
Expand All @@ -133,8 +131,7 @@ def main():
status = transpile_package(sourcef, language)
else:
for language in langs:
status = transpile_component(sourcef,newpackage,language)

status = transpile_component(sourcef, newpackage, language)


if __name__ == '__main__':
Expand Down
Loading
Loading