Create a Scade One project#

This section presents how to create a Scade One project using the Python API. You can start by creating a new project, then add modules, declarations, a diagram, blocks, and connections between them.

Note

Project dependencies have not supported yet. You should add the dependencies manually.

Create a new project#

Using the ScadeOne class, you can create a new project:

from ansys.scadeone.core import ScadeOne

project_path = Path(r"project1\project1.sproj")

app = ScadeOne()

project = app.new_project(project_path)

Once the project is created, you can add a new module interface:

m0_int = project.add_module_interface("module0")

Also, you can add a new module:

m0 = project.add_module("module0")

Namespace is also supported for creating new modules:

lib_m0 = project.add_module("lib::module1")

In the new module, you can add a new declaration using the Scade One text syntax:

type0 = m0_int.add_declaration("type type0 = int32")

Also, a declaration can be added using the ModuleBody or ModuleInterface add_<declaration>() methods.

For instance, to create a new constant, or new operators:

const0 = m0.add_constant("const0", "type0", "5")
op0_int = m0_int.add_signature("op0")
op0 = m0.add_operator("op0")

You can also add textual operators:

op1_str = """
    function op1 (in0: int32; in1: int32)
    returns (out0: int32)
    {
        let out0 = in0 + in1;
    }
"""
op1 = m0.add_textual_operator(op1_str)

Once an operator is added to the module, you can add inputs or outputs:

op0_int.add_input("in0", "int32")
op0_int.add_input("in1", "int32")
op0_int.add_output(declaration="out0: int32")
op0_int.add_output(declaration="out1: int32")

A module can be used in another module:

m0.use(lib_m0)  # or m0.use("lib::module0")

You can add a diagram, blocks, and connections between blocks to the operator, as it is presented in the following diagram:

../../_images/diagram.png

The corresponding code is:

diag_lib = lib_op.add_diagram()
lib_op_in0_block = diag_lib.add_expr_block(lib_op_in0)
lib_op_out0_block = diag_lib.add_def_block(lib_op_out0)
diag_lib.connect(lib_op_in0_block, lib_op_out0_block)

diag = op0.add_diagram()
op1_block = diag.add_block(op1)
op0_in0_block = diag.add_expr_block(op0_in0)
op0_in1_block = diag.add_expr_block(op0_in1)
const0_block = diag.add_expr_block(const0)
op0_out0_block = diag.add_def_block(op0_out0)
lib_op_block = diag.add_block(lib_op)
op0_out1_block = diag.add_def_block(op0_out1)

diag.connect(op0_in0_block, (op1_block, "in0"))
diag.connect(const0_block, (op1_block, "in1"))
diag.connect((op1_block, "out0"), op0_out0_block)
diag.connect(op0_in1_block, lib_op_block)
diag.connect(lib_op_block, op0_out1_block)

Finally, save the project, and look at the generated code:

project.save()

for m in project_path.parent.glob("assets/*.swan*"):
    print(f"{'=' * 20}\nModule: {m.name}\n{'=' * 20}")
    print(m.read_text())

Complete example#

This is the complete script presenting a Scade One model creation.

import shutil
from pathlib import Path

from ansys.scadeone.core import ScadeOne

project_path = Path(r"project1\project1.sproj")

app = ScadeOne()

project = app.new_project(project_path)

m0_int = project.add_module_interface("module0")
m0 = project.add_module("module0")
lib_m0 = project.add_module("lib::module1")

type0 = m0_int.add_declaration("type type0 = int32")
const0 = m0.add_constant("const0", "type0", "5")
op0_int = m0_int.add_signature("op0")
op0_int.add_input("in0", "int32")
op0_int.add_input("in1", "int32")
op0_int.add_output(declaration="out0: int32")
op0_int.add_output(declaration="out1: int32")

op0 = m0.add_operator("op0")
op0_in0 = op0.add_input("in0", "int32")
op0_in1 = op0.add_input("in1", "int32")
op0_out0 = op0.add_output("out0", "int32", default="5")
op0_out1 = op0.add_output(declaration="out1: int32")

op1_str = """
    function op1 (in0: int32; in1: int32)
    returns (out0: int32)
    {
        let out0 = in0 + in1;
    }
"""
op1 = m0.add_textual_operator(op1_str)

lib_op = lib_m0.add_operator("libOp")
lib_op_in0 = lib_op.add_input("in0", "int32")
lib_op_out0 = lib_op.add_output("out0", "int32")

m0.use(lib_m0)  # or m0.use("lib::module0")

diag_lib = lib_op.add_diagram()
lib_op_in0_block = diag_lib.add_expr_block(lib_op_in0)
lib_op_out0_block = diag_lib.add_def_block(lib_op_out0)
diag_lib.connect(lib_op_in0_block, lib_op_out0_block)

diag = op0.add_diagram()
op1_block = diag.add_block(op1)
op0_in0_block = diag.add_expr_block(op0_in0)
op0_in1_block = diag.add_expr_block(op0_in1)
const0_block = diag.add_expr_block(const0)
op0_out0_block = diag.add_def_block(op0_out0)
lib_op_block = diag.add_block(lib_op)
op0_out1_block = diag.add_def_block(op0_out1)

diag.connect(op0_in0_block, (op1_block, "in0"))
diag.connect(const0_block, (op1_block, "in1"))
diag.connect((op1_block, "out0"), op0_out0_block)
diag.connect(op0_in1_block, lib_op_block)
diag.connect(lib_op_block, op0_out1_block)

project.save()

for m in project_path.parent.glob("assets/*.swan*"):
    print(f"{'=' * 20}\nModule: {m.name}\n{'=' * 20}")
    print(m.read_text())