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:

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())