Skip to content
Snippets Groups Projects
Select Git revision
  • 39e1ffd645e18fbbd32cc33ab95406698ae29b0c
  • master default protected
  • tut_ring_allen
  • docs_furo
  • docs_reorder_cable_cell
  • docs_graphviz
  • docs_rtd_dev
  • ebrains_mirror
  • doc_recat
  • docs_spike_source
  • docs_sim_sample_clar
  • docs_pip_warn
  • github_template_updates
  • docs_fix_link
  • cv_default_and_doc_clarification
  • docs_add_numpy_req
  • readme_zenodo_05
  • install_python_fix
  • install_require_numpy
  • typofix_propetries
  • docs_recipe_lookup
  • v0.10.0
  • v0.10.1
  • v0.10.0-rc5
  • v0.10.0-rc4
  • v0.10.0-rc3
  • v0.10.0-rc2
  • v0.10.0-rc
  • v0.9.0
  • v0.9.0-rc
  • v0.8.1
  • v0.8
  • v0.8-rc
  • v0.7
  • v0.6
  • v0.5.2
  • v0.5.1
  • v0.5
  • v0.4
  • v0.3
  • v0.2.2
41 results

module.hpp

Blame
  • Ben Cumming's avatar
    Benjamin Cumming authored
    * update the out of date version of modparser was added to the repository
    * fix some warnings about unused static functions in a modcc test header
    * move modcc/src path contents to modcc, because there was little point having
      the additional sub directory.
    dfc43806
    History
    module.hpp 3.73 KiB
    #pragma once
    
    #include <string>
    #include <vector>
    
    #include "blocks.hpp"
    #include "expression.hpp"
    
    // wrapper around a .mod file
    class Module {
    public :
        using scope_type = Expression::scope_type;
        using symbol_map = scope_type::symbol_map;
        using symbol_ptr = scope_type::symbol_ptr;
    
        Module(std::string const& fname);
        Module(std::vector<char> const& buffer);
    
        std::vector<char> const& buffer() const {
            return buffer_;
        }
    
        std::string const& file_name()  const {return fname_;}
        std::string const& name()  const {return neuron_block_.name;}
    
        void               title(const std::string& t) {title_ = t;}
        std::string const& title() const          {return title_;}
    
        NeuronBlock &      neuron_block() {return neuron_block_;}
        NeuronBlock const& neuron_block() const {return neuron_block_;}
    
        StateBlock &       state_block()  {return state_block_;}
        StateBlock const&  state_block()  const {return state_block_;}
    
        UnitsBlock &       units_block()  {return units_block_;}
        UnitsBlock const&  units_block()  const {return units_block_;}
    
        ParameterBlock &       parameter_block()        {return parameter_block_;}
        ParameterBlock const&  parameter_block()  const {return parameter_block_;}
    
        AssignedBlock &       assigned_block()        {return assigned_block_;}
        AssignedBlock const&  assigned_block()  const {return assigned_block_;}
    
        void neuron_block(NeuronBlock const &n) {neuron_block_ = n;}
        void state_block (StateBlock  const &s) {state_block_  = s;}
        void units_block (UnitsBlock  const &u) {units_block_  = u;}
        void parameter_block (ParameterBlock  const &p) {parameter_block_  = p;}
        void assigned_block (AssignedBlock  const &a) {assigned_block_  = a;}
    
        // access to the AST
        std::vector<symbol_ptr>&      procedures();
        std::vector<symbol_ptr>const& procedures() const;
    
        std::vector<symbol_ptr>&      functions();
        std::vector<symbol_ptr>const& functions() const;
    
        symbol_map &      symbols();
        symbol_map const& symbols() const;
    
        // error handling
        void error(std::string const& msg, Location loc);
        std::string const& error_string() {
            return error_string_;
        }
    
        lexerStatus status() const {
            return status_;
        }
    
        // warnings
        void warning(std::string const& msg, Location loc);
        bool has_warning() const {
            return has_warning_;
        }
        bool has_error() const {
            return status()==lexerStatus::error;
        }
    
        moduleKind kind() const {
            return kind_;
        }
        void kind(moduleKind k) {
            kind_ = k;
        }
    
        // perform semantic analysis
        void add_variables_to_symbols();
        bool semantic();
        bool optimize();
    private :
        moduleKind kind_;
        std::string title_;
        std::string fname_;
        std::vector<char> buffer_; // character buffer loaded from file
    
        bool generate_initial_api();
        bool generate_current_api();
        bool generate_state_api();
    
        // error handling
        std::string error_string_;
        lexerStatus status_ = lexerStatus::happy;
        bool has_warning_ = false;
    
        // AST storage
        std::vector<symbol_ptr> procedures_;
        std::vector<symbol_ptr> functions_;
    
        // hash table for lookup of variable and call names
        symbol_map symbols_;
    
        /// tests if symbol is defined
        bool has_symbol(const std::string& name) {
            return symbols_.find(name) != symbols_.end();
        }
        /// tests if symbol is defined
        bool has_symbol(const std::string& name, symbolKind kind) {
            auto s = symbols_.find(name);
            return s == symbols_.end() ? false : s->second->kind() == kind;
        }
    
        // blocks
        NeuronBlock neuron_block_;
        StateBlock  state_block_;
        UnitsBlock  units_block_;
        ParameterBlock parameter_block_;
        AssignedBlock assigned_block_;
    };