{"id":196134,"date":"2025-02-05T11:13:08","date_gmt":"2025-02-05T11:13:08","guid":{"rendered":"https:\/\/innovationspace.ansys.com\/knowledge\/?post_type=topic&#038;p=196134"},"modified":"2025-04-04T16:53:11","modified_gmt":"2025-04-04T16:53:11","slug":"introducing-pyscadeone","status":"publish","type":"topic","link":"https:\/\/innovationspace.ansys.com\/knowledge\/forums\/topic\/introducing-pyscadeone\/","title":{"rendered":"Introducing PyScadeOne"},"content":{"rendered":"<h3  id=\"INTRODUCTION\">Introduction<\/h3>\n<p>With this blog, we are proud to announce the first release of PyScadeOne, the unified library for all scripting needs related to Scade One. It is now available for free on <a href=\"https:\/\/scadeone.docs.pyansys.com\/\">GitHub<\/a>, with the release of Scade One 2025 R1. So let us take a closer look at what PyScadeOne offers, including an example script to generate an instance tree from a model.<\/p>\n<p style=\"text-align: center\">\n    <img decoding=\"async\" src=\"https:\/\/innovationspace.ansys.com\/knowledge\/wp-content\/uploads\/sites\/4\/2025\/02\/scade-032-banner-scaled.jpg\" style=\"max-height: 700px !important\" \/><br \/>\n    <em>Photo credit: Godfrey Atima @ <a href=\"https:\/\/www.pexels.com\/photo\/close-up-of-codes-on-a-computer-screen-4976710\/\">Pexels<\/a><\/em>\n<\/p>\n<h3  id=\"ABOUT-PYSCADEONE\">About PyScadeOne<\/h3>\n<p>SCADE has always been open and provided Application Programming Interfaces (APIs) to ease integration into any workflow and environment. Ansys application engineers and customers have created many tools and extensions thanks to these APIs. We have started making some of these utilities available on <a href=\"https:\/\/github.com\/ansys?q=scade-\">GitHub<\/a>, to make it easier to for our users to access them. <\/p>\n<p>Scade One is no different and the goal of PyScadeOne is to take this openness to the next level. PyScadeOne is part of the <a href=\"https:\/\/www.ansys.com\/blog\/accessing-ansys-from-python\">PyAnsys initiative<\/a> to provide easy access to Ansys tools from Python. That is why PyScadeOne is delivered as an open-source library on GitHub, that can be easily deployed in any compatible Python environment (it supports Windows and Linux, and any version of Python greater than 3.9). It can be installed like any other Python library, using for instance pip:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff;overflow:auto;width:auto;background:none;border:none;padding:.2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span><\/span>&gt; pip install ansys-scadeone-core\r\n<\/pre>\n<\/div>\n<p>PyScadeOne comes with an extensive user documentation, including examples, at <a href=\"https:\/\/scadeone.docs.pyansys.com\/\">https:\/\/scadeone.docs.pyansys.com\/<\/a>, so you can quickly get started with the library.<\/p>\n<p>Note that PyScadeOne is also delivered as a Python wheel file (<code>.whl<\/code>) inside the Scade One installation, that can be installed for instance with:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff;overflow:auto;width:auto;background:none;border:none;padding:.2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span><\/span>&gt; pip install pyscadeone\/ansys_scadeone-0.6.0+43-py3-none-any.whl\r\n<\/pre>\n<\/div>\n<h3  id=\"PYSCADEONE-IN-THE-2025-R1-RELEASE\">PyScadeOne in the 2025 R1 release<\/h3>\n<p>PyScadeOne offers the following services:<\/p>\n<ul>\n<li><strong>Read or generate any data related to Scade One<\/strong>. In 2025 R1, you can already read or generate models, with advanced navigation services, as well as simulation data (that can be used as input or as expected values for testing). <\/li>\n<li>Customize or extend Scade One and integrate with 3rd party tools:\n<ul>\n<li><strong>Generate integration code<\/strong> by accessing information about the generated code (for instance the names of the functions and variables in the generated C code and how they map to the input model). In particular, Scade One 2025 R1 allows to export models as Functional Mock-up Units (<strong>FMU<\/strong>s), following the <a href=\"https:\/\/fmi-standard.org\/\">FMI 2.0 standard<\/a>. This export uses PyScadeOne to automatically generate the required wrapping code<\/li>\n<li><strong>Access test results<\/strong> to generate custom reports or export these results to another format.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>PyScadeOne will continue evolving in future versions to provide even more services. For instance, future versions will include a <em>rule checker<\/em>, to define and verify modeling rules automatically.<\/p>\n<h3  id=\"USING-PYSCADEONE-TO-PRINT-AN-INSTANCE-TREE\">Using PyScadeOne to print an instance tree<\/h3>\n<p>After this quick introduction to PyScadeOne, let us now look at an example of a Python script using this library. Our goal is to print an <em>instance tree<\/em> from a model: if an operator <code>Op1<\/code> uses an instance of operator <code>Op2<\/code>, then <code>Op2<\/code> is a child of <code>Op1<\/code> in the instance tree. Here is an example of such tree, based on the <code>QuadFlightControl<\/code> example delivered with Scade One:<\/p>\n<p style=\"text-align: center\">\n    <img decoding=\"async\" src=\"https:\/\/innovationspace.ansys.com\/knowledge\/wp-content\/uploads\/sites\/4\/2025\/02\/scade-032-quadflightcontrol-motorcontrol-graph.svg\" style=\"max-height: 300px !important\" \/><br \/>\n    <em><\/em>\n<\/p>\n<p>Such a visualization could be useful for instance in a model report, to better understand the structure of the model.<\/p>\n<p>Our script will proceed as follows to create the instance tree:<\/p>\n<ul>\n<li>Open the project and access the model<\/li>\n<li>Compute the list of used operators for any operator in the model<\/li>\n<li>Build the instance tree, starting from the chosen root operator<\/li>\n<li>Print the tree<\/li>\n<\/ul>\n<p>We will now describe each of these steps.<\/p>\n<h5  id=\"ACCESSING-THE-MODEL\">Accessing the model<\/h5>\n<p>Our first step is to open a project and access the corresponding model. First, we import the PyScadeOne library:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff;overflow:auto;width:auto;background:none;border:none;padding:.2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span><\/span><span style=\"font-weight: bold\">from<\/span> <span style=\"color: #555555\">ansys.scadeone.core.scadeone<\/span> <span style=\"font-weight: bold\">import<\/span> ScadeOne\r\n<\/pre>\n<\/div>\n<p>Then, we load the project (given here as input of the script, using the standard <a href=\"https:\/\/docs.python.org\/3\/library\/argparse.html\">argparse<\/a> library):<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff;overflow:auto;width:auto;background:none;border:none;padding:.2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span><\/span>app <span style=\"font-weight: bold\">=<\/span> ScadeOne(install_dir<span style=\"font-weight: bold\">=<\/span>scade_one_install_dir)\r\nproject <span style=\"font-weight: bold\">=<\/span> app<span style=\"font-weight: bold\">.<\/span>load_project(args<span style=\"font-weight: bold\">.<\/span>project)\r\nproject<span style=\"font-weight: bold\">.<\/span>model<span style=\"font-weight: bold\">.<\/span>load_all_modules()\r\n<\/pre>\n<\/div>\n<h5  id=\"COMPUTING-THE-LIST-OF-USED-OPERATORS\">Computing the list of used operators<\/h5>\n<p>To build the instance tree, we first traverse the model to compute the list of operators called by each operator. We then use this information to build a tree starting from the root operator we have chosen. <\/p>\n<p>We are in luck, because <a href=\"https:\/\/scadeone.docs.pyansys.com\/version\/dev\/examples\/visitor\/index.html\">one of the examples<\/a> provided with PyScadeOne is already computing this information. This example uses the Swan model <a href=\"https:\/\/en.wikipedia.org\/wiki\/Visitor_pattern\">visitor<\/a>, which is a standard way to traverse an <em>Abstract Syntax Tree<\/em> (AST) like a Swan model. Remember that Swan is the domain-specific language used for modeling in Scade One, that has been described in <a href=\"https:\/\/innovationspace.ansys.com\/knowledge\/forums\/topic\/scade-one-bridging-the-gap-between-model-based-design-and-traditional-programming\/\">previous blogs<\/a>. A visitor is a class that contains one method for each kind of object in the model. The visitor traverses the model and calls the corresponding methods for each object. Methods can be redefined to implement the desired behavior. <\/p>\n<p>In our case, we redefine two methods:<\/p>\n<ul>\n<li><code>visit_Operator<\/code>, which is called for each operator definition, to remember what operator we are currently traversing (in the <code>self._current_op<\/code> field)<\/li>\n<li><code>visit_PathIdOpCall<\/code>, which is called for each instance of a named operator. We will add this operator name to the list of operators called by <code>self._current_op<\/code> in the <code>self._called<\/code> dictionary.<\/li>\n<\/ul>\n<p>Here is the complete code of our visitor:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff;overflow:auto;width:auto;background:none;border:none;padding:.2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span><\/span><span style=\"font-weight: bold\">class<\/span> <span style=\"color: #445588;font-weight: bold\">InstanceVisitor<\/span>(SwanVisitor):\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #bb8844\">&quot;&quot;&quot;Visitor to compute the operators called by all operators in the model&quot;&quot;&quot;<\/span>\r\n\r\n    <span style=\"font-weight: bold\">def<\/span> <span style=\"color: #990000;font-weight: bold\">__init__<\/span>(<span style=\"color: #999999\">self<\/span>) <span style=\"font-weight: bold\">-&gt;<\/span> <span style=\"font-weight: bold\">None<\/span>:\r\n        <span style=\"color: #999999\">super<\/span>()<span style=\"font-weight: bold\">.<\/span><span style=\"color: #990000;font-weight: bold\">__init__<\/span>()\r\n        <span style=\"color: #999999\">self<\/span><span style=\"font-weight: bold\">.<\/span>_current_op: swan<span style=\"font-weight: bold\">.<\/span>Operator <span style=\"font-weight: bold\">=<\/span> <span style=\"font-weight: bold\">None<\/span>\r\n        <span style=\"color: #999999\">self<\/span><span style=\"font-weight: bold\">.<\/span>_called <span style=\"font-weight: bold\">=<\/span> {}\r\n\r\n    <span style=\"font-weight: bold\">def<\/span> <span style=\"color: #990000;font-weight: bold\">get_called<\/span>(<span style=\"color: #999999\">self<\/span>, op):\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #bb8844\">&quot;&quot;&quot;Returns the list of operators called by &#039;op&#039;&quot;&quot;&quot;<\/span>\r\n        <span style=\"font-weight: bold\">return<\/span> <span style=\"color: #999999\">self<\/span><span style=\"font-weight: bold\">.<\/span>_called<span style=\"font-weight: bold\">.<\/span>get(op, <span style=\"font-weight: bold\">None<\/span>)\r\n\r\n    <span style=\"font-weight: bold\">def<\/span> <span style=\"color: #990000;font-weight: bold\">visit_Operator<\/span>(\r\n        <span style=\"color: #999999\">self<\/span>, swan_obj: swan<span style=\"font-weight: bold\">.<\/span>Operator, owner: Union[swan<span style=\"font-weight: bold\">.<\/span>Any, <span style=\"font-weight: bold\">None<\/span>], <span style=\"color: #999999\">property<\/span>: Union[<span style=\"color: #999999\">str<\/span>, <span style=\"font-weight: bold\">None<\/span>]\r\n    ) <span style=\"font-weight: bold\">-&gt;<\/span> <span style=\"font-weight: bold\">None<\/span>:\r\n        <span style=\"color: #999988;font-style: italic\"># Called when visiting an operator. Sets _current_op to the current operator and continues traversal<\/span>\r\n        <span style=\"color: #999999\">self<\/span><span style=\"font-weight: bold\">.<\/span>_current_op <span style=\"font-weight: bold\">=<\/span> swan_obj\r\n        <span style=\"color: #999999\">self<\/span><span style=\"font-weight: bold\">.<\/span>_called[swan_obj<span style=\"font-weight: bold\">.<\/span>get_full_path()] <span style=\"font-weight: bold\">=<\/span> []\r\n        <span style=\"color: #999999\">super<\/span>()<span style=\"font-weight: bold\">.<\/span>visit_Operator(swan_obj, owner, <span style=\"color: #999999\">property<\/span>)\r\n        <span style=\"color: #999999\">self<\/span><span style=\"font-weight: bold\">.<\/span>_current_op <span style=\"font-weight: bold\">=<\/span> <span style=\"font-weight: bold\">None<\/span>\r\n\r\n    <span style=\"font-weight: bold\">def<\/span> <span style=\"color: #990000;font-weight: bold\">visit_PathIdOpCall<\/span>(\r\n        <span style=\"color: #999999\">self<\/span>, swan_obj: swan<span style=\"font-weight: bold\">.<\/span>PathIdOpCall, owner: Union[swan<span style=\"font-weight: bold\">.<\/span>Any, <span style=\"font-weight: bold\">None<\/span>], <span style=\"color: #999999\">property<\/span>: Union[<span style=\"color: #999999\">str<\/span>, <span style=\"font-weight: bold\">None<\/span>]\r\n    ) <span style=\"font-weight: bold\">-&gt;<\/span> <span style=\"font-weight: bold\">None<\/span>:\r\n        <span style=\"color: #999988;font-style: italic\"># ignore unknown operators<\/span>\r\n        <span style=\"font-weight: bold\">if<\/span> <span style=\"color: #999999\">self<\/span><span style=\"font-weight: bold\">.<\/span>_current_op <span style=\"font-weight: bold\">is<\/span> <span style=\"font-weight: bold\">None<\/span>:\r\n            <span style=\"font-weight: bold\">return<\/span>\r\n        name <span style=\"font-weight: bold\">=<\/span> <span style=\"color: #999999\">str<\/span>(swan_obj<span style=\"font-weight: bold\">.<\/span>path_id)\r\n        op <span style=\"font-weight: bold\">=<\/span> <span style=\"color: #999999\">self<\/span><span style=\"font-weight: bold\">.<\/span>_current_op<span style=\"font-weight: bold\">.<\/span>body<span style=\"font-weight: bold\">.<\/span>get_declaration(name)\r\n        <span style=\"font-weight: bold\">if<\/span> op <span style=\"font-weight: bold\">is<\/span> <span style=\"font-weight: bold\">None<\/span>:\r\n            <span style=\"font-weight: bold\">return<\/span>\r\n\r\n        <span style=\"color: #999988;font-style: italic\"># add called_operator to the list of called operators<\/span>\r\n        called_operator <span style=\"font-weight: bold\">=<\/span> cast(swan<span style=\"font-weight: bold\">.<\/span>Operator, op)<span style=\"font-weight: bold\">.<\/span>get_full_path()\r\n        current_op_name <span style=\"font-weight: bold\">=<\/span> <span style=\"color: #999999\">self<\/span><span style=\"font-weight: bold\">.<\/span>_current_op<span style=\"font-weight: bold\">.<\/span>get_full_path()\r\n        <span style=\"font-weight: bold\">if<\/span> called_operator <span style=\"font-weight: bold\">not<\/span> <span style=\"font-weight: bold\">in<\/span> <span style=\"color: #999999\">self<\/span><span style=\"font-weight: bold\">.<\/span>_called[current_op_name]:\r\n            <span style=\"color: #999999\">self<\/span><span style=\"font-weight: bold\">.<\/span>_called[current_op_name]<span style=\"font-weight: bold\">.<\/span>append(called_operator)\r\n<\/pre>\n<\/div>\n<p>We can then easily apply our visitor to the complete model:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff;overflow:auto;width:auto;background:none;border:none;padding:.2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span><\/span>visitor <span style=\"font-weight: bold\">=<\/span> InstanceVisitor()\r\n<span style=\"font-weight: bold\">for<\/span> module <span style=\"font-weight: bold\">in<\/span> model<span style=\"font-weight: bold\">.<\/span>modules:\r\n    visitor<span style=\"font-weight: bold\">.<\/span>visit(module)\r\n<\/pre>\n<\/div>\n<p>At this point, calling <code>visitor.get_called(op)<\/code> will return the list of operators called by any operator in the model.<\/p>\n<h5  id=\"BUILDING-AND-PRINTING-THE-INSTANCE-TREE\">Building and printing the instance tree<\/h5>\n<p>Now that we have computed the list of used operators, the rest of the code is standard Python, so we won&#8217;t go into too much detail. To simplify our task, we leverage the rich ecosystem of Python libraries. We use <a href=\"https:\/\/pypi.org\/project\/networkx\/\">NetworkX<\/a> to represent the tree\/graph and <a href=\"https:\/\/pypi.org\/project\/pydot\/\">pydot<\/a> to print it, using the famous <a href=\"https:\/\/graphviz.org\/\">Graphviz<\/a> tool. That is one of the main strengths of Python: whatever you want to do, there&#8217;s always a library to help you.<\/p>\n<p>For instance, the following function is used to add an operator to the tree, represented as a NetworkX graph, starting from the root operator. Note that we are considering library operators as leaves in the instance tree.<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff;overflow:auto;width:auto;background:none;border:none;padding:.2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span><\/span><span style=\"font-weight: bold\">def<\/span> <span style=\"color: #990000;font-weight: bold\">add_to_graph<\/span>(G, op, visitor):\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #bb8844\">&quot;&quot;&quot;Add node `op` to the graph `G`, using info from `visitor`&quot;&quot;&quot;<\/span>\r\n    G<span style=\"font-weight: bold\">.<\/span>add_node(op)\r\n    called_ops <span style=\"font-weight: bold\">=<\/span> visitor<span style=\"font-weight: bold\">.<\/span>get_called(op)\r\n    <span style=\"color: #999988;font-style: italic\"># ignore called operators for library operators<\/span>\r\n    <span style=\"font-weight: bold\">if<\/span> <span style=\"font-weight: bold\">not<\/span> is_library_operator(op) <span style=\"font-weight: bold\">and<\/span> called_ops:\r\n        <span style=\"font-weight: bold\">for<\/span> called_op <span style=\"font-weight: bold\">in<\/span> called_ops:\r\n            G<span style=\"font-weight: bold\">.<\/span>add_edge(op, called_op)\r\n            add_to_graph(G, called_op, visitor)\r\n<\/pre>\n<\/div>\n<p>Similarly, we have also created a function <code>print_graph<\/code> that takes as input a graph and an output path, and generates the PNG file using Graphviz (that we won&#8217;t show here).<\/p>\n<h5  id=\"RUNNING-THE-SCRIPT\">Running the script<\/h5>\n<p>To be able to run the script, you first must install its dependencies using the included <code>requirements.txt<\/code> file. You just need to run, for instance in a <a href=\"https:\/\/docs.python.org\/3\/library\/venv.html\">virtual environment<\/a>:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff;overflow:auto;width:auto;background:none;border:none;padding:.2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span><\/span>&gt; pip install -r requirements.txt\r\n<\/pre>\n<\/div>\n<p>You also must install the <a href=\"https:\/\/graphviz.org\/\">Graphviz<\/a> tool, that will generate the PNG file from the graph description.<\/p>\n<p>Note: make sure that the path of your local Graphviz installation matches the one near the beginning of the <code>instance_tree.py<\/code> script:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff;overflow:auto;width:auto;background:none;border:none;padding:.2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span><\/span>graphviz_path <span style=\"font-weight: bold\">=<\/span> <span style=\"color: #bb8844\">r&#039;C:\\Program Files\\Graphviz\\bin&#039;<\/span> <span style=\"color: #999988;font-style: italic\"># Should be manually set if not already in PATH<\/span>\r\n<\/pre>\n<\/div>\n<p>We can now apply our script to the <code>QuadFlightControl<\/code> example, with the <code>QuadFlightControl::QuadFlightControl<\/code> operator as root, with the following command line:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff;overflow:auto;width:auto;background:none;border:none;padding:.2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span><\/span>&gt; python instance_tree.py <span style=\"color: #bb8844\">&quot;C:\\Program Files\\ANSYS Inc\\v251\\Scade One\\examples\\QuadFlightControl\\QuadFlightControl\\QuadFlightControl.sproj&quot;<\/span> <span style=\"color: #bb8844\">&quot;QuadFlightControl::QuadFlightControl&quot;<\/span>\r\n<\/pre>\n<\/div>\n<p>It generates the following tree:<\/p>\n<p style=\"text-align: center\">\n    <img decoding=\"async\" src=\"https:\/\/innovationspace.ansys.com\/knowledge\/wp-content\/uploads\/sites\/4\/2025\/02\/scade-032-quadflightcontrol-quadflightcontrol-graph.svg\" style=\"max-height: 400px !important\" \/><br \/>\n    <em><\/em>\n<\/p>\n<p>Note that we have added the library operators in blue boxes as a bonus. We could get some inspiration from the <a href=\"https:\/\/graphviz.org\/gallery\/\">Graphviz gallery<\/a> to generate a better-looking tree (and we probably should), but that&#8217;s a topic for another day.<\/p>\n<h3  id=\"WANT-TO-LEARN-MORE\">Want to learn more?<\/h3>\n<p>You can download the script from this blog <a href=\"https:\/\/ansys13.ansys.com\/KnowledgeArticles\/SCADE\/pyscadeone_instance_tree.zip\">here<\/a>. And of course, you can install PyScadeOne using your favorite method, like <code>pip<\/code>, as shown at the beginning of the blog.<\/p>\n<p>If you want to learn more about PyScadeOne, a webinar will be hosted on April 3, 2025 (<a href=\"https:\/\/www.ansys.com\/webinars\/boost-your-embedded-systems-development-with-pyscadeone\">link<\/a>). You may also schedule a live demo of Scade One using this <a href=\"https:\/\/www.ansys.com\/products\/embedded-software\/request-assessment-scade-one\">link<\/a>. Also, if you are a SCADE user, access Scade One Essential with your existing licenses on the <a href=\"https:\/\/download.ansys.com\">Ansys Download Portal<\/a>.<\/p>\n<p>PyScadeOne will continue to evolve in future versions, so expect regular blogs about it, demonstrating its capabilities and how it can be used to extend Scade One, for instance to connect it to 3rd party tools.<\/p>\n<p>Stay tuned for more information about the new features in Scade One 2025 R1, including model-based testing thanks to the test harness concept.<\/p>\n<h3  id=\"ABOUT-THE-AUTHOR\">About the author<\/h3>\n<table style=\"border: none !important\">\n<tr>\n<td style=\"border: none !important\">\n<p style=\"text-align: center\">\n    <img decoding=\"async\" src=\"https:\/\/innovationspace.ansys.com\/knowledge\/wp-content\/uploads\/sites\/4\/2025\/02\/scade-032-author.png\" style=\"max-height: 150px !important\" \/><br \/>\n                <em><\/em>\n<\/p>\n<\/td>\n<td style=\"border: none !important\">\n<p><strong>C\u00e9dric Pasteur<\/strong> (<a href=\"https:\/\/www.linkedin.com\/in\/c%C3%A9dric-pasteur-9b430b25\/\">LinkedIn<\/a>) is a Senior Product Manager at Ansys. He has been working on Scade One, Ansys&#8217; latest-generation model-based embedded software development product, since its inception. He specializes in programming language theory and its application to safe embedded systems.<\/p>\n<\/td>\n<\/tr>\n<\/table>\n","protected":false},"template":"","class_list":["post-196134","topic","type-topic","status-publish","hentry","topic-tag-pyansys","topic-tag-pyscadeone","topic-tag-python","topic-tag-scade-one"],"aioseo_notices":[],"acf":[],"custom_fields":[{"0":{"_edit_lock":["1743785571:1769"],"_edit_last":["1769"],"_aioseo_title":[null],"_aioseo_description":[null],"_aioseo_keywords":["a:0:{}"],"_aioseo_og_title":[""],"_aioseo_og_description":[""],"_aioseo_og_article_section":[""],"_aioseo_og_article_tags":["a:0:{}"],"_aioseo_twitter_title":[""],"_aioseo_twitter_description":[""],"filter_by_optics_product":["Lumerical"],"_filter_by_optics_product":["field_64fb192ba3121"],"application_name":[""],"_application_name":["field_64a80903c8e15"],"family":[""],"_family":["field_64a809229a857"],"siebel_km_number":[""],"_siebel_km_number":["field_63ecbffce60db"],"salesforce_km_number":[""],"_salesforce_km_number":["field_63ecc018e60dc"],"km_published_date":[""],"_km_published_date":["field_64c77704499dd"],"product_version":[""],"_product_version":["field_64c776cb4fd2e"],"_bbp_forum_id":["27825"],"_bbp_topic_id":["196494"],"_bbp_author_ip":["20.82.84.9"],"_bbp_last_reply_id":["0"],"_bbp_last_active_id":["196135"],"_bbp_last_active_time":["2025-02-05 11:13:08"],"_bbp_reply_count":["0"],"_bbp_reply_count_hidden":["0"],"_bbp_voice_count":["0"],"_btv_view_count":["1137"],"_bbp_likes_count":["13"]},"test":"solution"}],"_links":{"self":[{"href":"https:\/\/innovationspace.ansys.com\/knowledge\/wp-json\/wp\/v2\/topics\/196134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/innovationspace.ansys.com\/knowledge\/wp-json\/wp\/v2\/topics"}],"about":[{"href":"https:\/\/innovationspace.ansys.com\/knowledge\/wp-json\/wp\/v2\/types\/topic"}],"version-history":[{"count":10,"href":"https:\/\/innovationspace.ansys.com\/knowledge\/wp-json\/wp\/v2\/topics\/196134\/revisions"}],"predecessor-version":[{"id":196494,"href":"https:\/\/innovationspace.ansys.com\/knowledge\/wp-json\/wp\/v2\/topics\/196134\/revisions\/196494"}],"wp:attachment":[{"href":"https:\/\/innovationspace.ansys.com\/knowledge\/wp-json\/wp\/v2\/media?parent=196134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}