Skip to content

Commit

Permalink
Add a check for external definition that are not thread safe
Browse files Browse the repository at this point in the history
  • Loading branch information
Nicolas Cornu committed Sep 1, 2022
1 parent 60249f1 commit 3699a27
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/lexer/token_mapping.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,12 @@ const static std::vector<std::string> extern_definitions = {"acos",
"tanh",
"threshold"};
const static std::vector<std::string> need_nt = {"at_time"};
const static std::vector<std::string> not_thread_safe = {"force", "deflate", "expfit", "derivs", "spline", "exprand", "gauss", "normrand", "poisrand", "poisson", "setseed", "scop_random", "boundary", "romberg", "invert", "stepforce", "schedule", "set_seed", "nrn_random_play"};

bool is_external_definitions(const std::string& token) {
return std::find(extern_definitions.cbegin(), extern_definitions.cend(), token) != extern_definitions.cend();
}


/**
* Checks if \c token is one of the functions coming from NEURON/CoreNEURON and needs
Expand All @@ -259,6 +265,11 @@ bool needs_neuron_thread_first_arg(const std::string& token) {
}


bool is_not_thread_safe(const std::string& token) {
return std::find(not_thread_safe.cbegin(), not_thread_safe.cend(), token) != not_thread_safe.cend();
}


/**
* Variables from NEURON that are directly used in NMODL
*
Expand Down
2 changes: 2 additions & 0 deletions src/lexer/token_mapping.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ std::vector<std::string> get_external_functions();

namespace details {

bool is_external_definitions(const std::string& token);
bool needs_neuron_thread_first_arg(const std::string& token);
bool is_not_thread_safe(const std::string& token);

} // namespace details

Expand Down
11 changes: 11 additions & 0 deletions src/visitors/semantic_analysis_visitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "ast/table_statement.hpp"
#include "utils/logger.hpp"
#include "visitors/visitor_utils.hpp"
#include "lexer/token_mapping.hpp"

namespace nmodl {
namespace visitor {
Expand Down Expand Up @@ -78,5 +79,15 @@ void SemanticAnalysisVisitor::visit_destructor_block(const ast::DestructorBlock&
/// -->
}

void SemanticAnalysisVisitor::visit_function_call(const ast::FunctionCall& node) {
/// <-- This code is for check 4
const auto& name = node.get_node_name();
if (details::is_external_definitions(name) && details::is_not_thread_safe(name)) {
logger->critical("SemanticAnalysisVisitor :: '{}' is not thread safe and incompatible with CoreNEURON", name);
check_fail = true;
}
/// -->
}

} // namespace visitor
} // namespace nmodl
5 changes: 5 additions & 0 deletions src/visitors/semantic_analysis_visitor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
* (mandatory in mod2c).
* 2. Check that destructor blocks are only inside mod file that are point_process
* 3. A TABLE statement in functions cannot have name list, and should have one in procedures
* 4. Check that an external definition is allowed by CoreNeuron
*/
#include "ast/ast.hpp"
#include "visitors/ast_visitor.hpp"
Expand Down Expand Up @@ -59,6 +60,10 @@ class SemanticAnalysisVisitor: public ConstAstVisitor {
/// Visit destructor and check that the file is of type POINT_PROCESS or ARTIFICIAL_CELL
void visit_destructor_block(const ast::DestructorBlock& node) override;

/// Visit function call and check if the function is not thread safe and so not
/// compatible with CoreNeuron
void visit_function_call(const ast::FunctionCall& node) override;

public:
SemanticAnalysisVisitor() = default;

Expand Down

0 comments on commit 3699a27

Please sign in to comment.