Merge branch 'compiler' into 'master'
add compiler statement See merge request Dynare/preprocessor!11issue#70
commit
b5b0099064
|
@ -84,7 +84,7 @@ class ParsingDriver;
|
||||||
%token END ENDVAL EQUAL ESTIMATION ESTIMATED_PARAMS ESTIMATED_PARAMS_BOUNDS ESTIMATED_PARAMS_INIT EXTENDED_PATH ENDOGENOUS_PRIOR EXPRESSION
|
%token END ENDVAL EQUAL ESTIMATION ESTIMATED_PARAMS ESTIMATED_PARAMS_BOUNDS ESTIMATED_PARAMS_INIT EXTENDED_PATH ENDOGENOUS_PRIOR EXPRESSION
|
||||||
%token FILENAME DIRNAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS LAST_OBS SET_TIME OSR_PARAMS_BOUNDS KEEP_KALMAN_ALGO_IF_SINGULARITY_IS_DETECTED
|
%token FILENAME DIRNAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS LAST_OBS SET_TIME OSR_PARAMS_BOUNDS KEEP_KALMAN_ALGO_IF_SINGULARITY_IS_DETECTED
|
||||||
%token <string> FLOAT_NUMBER DATES
|
%token <string> FLOAT_NUMBER DATES
|
||||||
%token DEFAULT FIXED_POINT FLIP OPT_ALGO
|
%token DEFAULT FIXED_POINT FLIP OPT_ALGO COMPILATION_SETUP COMPILER ADD_FLAGS SUBSTITUTE_FLAGS ADD_LIBS SUBSTITUTE_LIBS
|
||||||
%token FORECAST K_ORDER_SOLVER INSTRUMENTS SHIFT MEAN STDEV VARIANCE MODE INTERVAL SHAPE DOMAINN
|
%token FORECAST K_ORDER_SOLVER INSTRUMENTS SHIFT MEAN STDEV VARIANCE MODE INTERVAL SHAPE DOMAINN
|
||||||
%token GAMMA_PDF GRAPH GRAPH_FORMAT CONDITIONAL_VARIANCE_DECOMPOSITION NOCHECK STD
|
%token GAMMA_PDF GRAPH GRAPH_FORMAT CONDITIONAL_VARIANCE_DECOMPOSITION NOCHECK STD
|
||||||
%token HISTVAL HISTVAL_FILE HOMOTOPY_SETUP HOMOTOPY_MODE HOMOTOPY_STEPS HOMOTOPY_FORCE_CONTINUE HP_FILTER HP_NGRID HYBRID ONE_SIDED_HP_FILTER
|
%token HISTVAL HISTVAL_FILE HOMOTOPY_SETUP HOMOTOPY_MODE HOMOTOPY_STEPS HOMOTOPY_FORCE_CONTINUE HP_FILTER HP_NGRID HYBRID ONE_SIDED_HP_FILTER
|
||||||
|
@ -308,6 +308,7 @@ statement : parameters
|
||||||
| init2shocks
|
| init2shocks
|
||||||
| det_cond_forecast
|
| det_cond_forecast
|
||||||
| var_expectation_model
|
| var_expectation_model
|
||||||
|
| compilation_setup
|
||||||
;
|
;
|
||||||
|
|
||||||
dsample : DSAMPLE INT_NUMBER ';'
|
dsample : DSAMPLE INT_NUMBER ';'
|
||||||
|
@ -890,6 +891,24 @@ epilogue_equation : NAME { driver.add_epilogue_variable($1); } EQUAL expression
|
||||||
{ driver.add_epilogue_equal($1, $4); }
|
{ driver.add_epilogue_equal($1, $4); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
compilation_setup : COMPILATION_SETUP '(' compilation_setup_options_list ')' ';' { };
|
||||||
|
|
||||||
|
compilation_setup_options_list : compilation_setup_options_list COMMA compilation_setup_option
|
||||||
|
| compilation_setup_option
|
||||||
|
;
|
||||||
|
|
||||||
|
compilation_setup_option : SUBSTITUTE_FLAGS EQUAL QUOTED_STRING
|
||||||
|
{ driver.compilation_setup_substitute_flags($3); }
|
||||||
|
| ADD_FLAGS EQUAL QUOTED_STRING
|
||||||
|
{ driver.compilation_setup_add_flags($3); }
|
||||||
|
| SUBSTITUTE_LIBS EQUAL QUOTED_STRING
|
||||||
|
{ driver.compilation_setup_substitute_libs($3); }
|
||||||
|
| ADD_LIBS EQUAL QUOTED_STRING
|
||||||
|
{ driver.compilation_setup_add_libs($3); }
|
||||||
|
| COMPILER EQUAL QUOTED_STRING
|
||||||
|
{ driver.compilation_setup_compiler($3); }
|
||||||
|
;
|
||||||
|
|
||||||
model_options : BLOCK { driver.block(); }
|
model_options : BLOCK { driver.block(); }
|
||||||
| o_cutoff
|
| o_cutoff
|
||||||
| o_mfs
|
| o_mfs
|
||||||
|
|
|
@ -186,6 +186,7 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]|w([1-9]{1}|[1-4][0-9]|5[0-2]))
|
||||||
<INITIAL>perfect_foresight_setup {BEGIN DYNARE_STATEMENT; return token::PERFECT_FORESIGHT_SETUP;}
|
<INITIAL>perfect_foresight_setup {BEGIN DYNARE_STATEMENT; return token::PERFECT_FORESIGHT_SETUP;}
|
||||||
<INITIAL>perfect_foresight_solver {BEGIN DYNARE_STATEMENT; return token::PERFECT_FORESIGHT_SOLVER;}
|
<INITIAL>perfect_foresight_solver {BEGIN DYNARE_STATEMENT; return token::PERFECT_FORESIGHT_SOLVER;}
|
||||||
<INITIAL>det_cond_forecast {BEGIN DYNARE_STATEMENT; return token::DET_COND_FORECAST;}
|
<INITIAL>det_cond_forecast {BEGIN DYNARE_STATEMENT; return token::DET_COND_FORECAST;}
|
||||||
|
<INITIAL>compilation_setup {BEGIN DYNARE_STATEMENT; return token::COMPILATION_SETUP;}
|
||||||
|
|
||||||
<DYNARE_STATEMENT>; {
|
<DYNARE_STATEMENT>; {
|
||||||
if (!sigma_e)
|
if (!sigma_e)
|
||||||
|
@ -563,6 +564,11 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]|w([1-9]{1}|[1-4][0-9]|5[0-2]))
|
||||||
<DYNARE_STATEMENT>tolf {return token::TOLF;}
|
<DYNARE_STATEMENT>tolf {return token::TOLF;}
|
||||||
<DYNARE_STATEMENT>tolx {return token::TOLX;}
|
<DYNARE_STATEMENT>tolx {return token::TOLX;}
|
||||||
<DYNARE_STATEMENT>opt_algo {return token::OPT_ALGO;}
|
<DYNARE_STATEMENT>opt_algo {return token::OPT_ALGO;}
|
||||||
|
<DYNARE_STATEMENT>add_flags {return token::ADD_FLAGS;}
|
||||||
|
<DYNARE_STATEMENT>substitute_flags {return token::SUBSTITUTE_FLAGS;}
|
||||||
|
<DYNARE_STATEMENT>add_libs {return token::ADD_LIBS;}
|
||||||
|
<DYNARE_STATEMENT>substitute_libs {return token::SUBSTITUTE_LIBS;}
|
||||||
|
<DYNARE_STATEMENT>compiler {return token::COMPILER;}
|
||||||
<DYNARE_STATEMENT>instruments {return token::INSTRUMENTS;}
|
<DYNARE_STATEMENT>instruments {return token::INSTRUMENTS;}
|
||||||
<DYNARE_STATEMENT>hessian {
|
<DYNARE_STATEMENT>hessian {
|
||||||
yylval->build<string>(yytext);
|
yylval->build<string>(yytext);
|
||||||
|
|
|
@ -68,8 +68,11 @@ dynare_m_CPPFLAGS = $(BOOST_CPPFLAGS) -I.
|
||||||
dynare_m_LDFLAGS = $(AM_LDFLAGS) $(BOOST_LDFLAGS)
|
dynare_m_LDFLAGS = $(AM_LDFLAGS) $(BOOST_LDFLAGS)
|
||||||
dynare_m_LDADD = macro/libmacro.a -lstdc++fs
|
dynare_m_LDADD = macro/libmacro.a -lstdc++fs
|
||||||
|
|
||||||
|
# -Ca flag comes from hitting a hard-coded size limit.
|
||||||
|
# Partial explanation: https://www.owlfolio.org/possibly-useful/flex-input-scanner-rules-are-too-complicated
|
||||||
|
# There is a Debian bug report about this: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=642040
|
||||||
DynareFlex.cc: DynareFlex.ll
|
DynareFlex.cc: DynareFlex.ll
|
||||||
$(LEX) -o DynareFlex.cc DynareFlex.ll
|
$(LEX) -Ca -o DynareFlex.cc DynareFlex.ll
|
||||||
|
|
||||||
FlexLexer.h:
|
FlexLexer.h:
|
||||||
cp $(LEXINC)/FlexLexer.h . || test -f ./FlexLexer.h
|
cp $(LEXINC)/FlexLexer.h . || test -f ./FlexLexer.h
|
||||||
|
|
|
@ -102,6 +102,11 @@ ModelTree::ModelTree(SymbolTable &symbol_table_arg,
|
||||||
|
|
||||||
ModelTree::ModelTree(const ModelTree &m) :
|
ModelTree::ModelTree(const ModelTree &m) :
|
||||||
DataTree {m},
|
DataTree {m},
|
||||||
|
user_set_add_flags {m.user_set_add_flags},
|
||||||
|
user_set_subst_flags {m.user_set_subst_flags},
|
||||||
|
user_set_add_libs {m.user_set_add_libs},
|
||||||
|
user_set_subst_libs {m.user_set_subst_libs},
|
||||||
|
user_set_compiler {m.user_set_compiler},
|
||||||
equations_lineno {m.equations_lineno},
|
equations_lineno {m.equations_lineno},
|
||||||
equation_tags {m.equation_tags},
|
equation_tags {m.equation_tags},
|
||||||
equation_tags_xref {m.equation_tags_xref},
|
equation_tags_xref {m.equation_tags_xref},
|
||||||
|
@ -157,6 +162,12 @@ ModelTree::operator=(const ModelTree &m)
|
||||||
cutoff = m.cutoff;
|
cutoff = m.cutoff;
|
||||||
mfs = m.mfs;
|
mfs = m.mfs;
|
||||||
|
|
||||||
|
user_set_add_flags = m.user_set_add_flags;
|
||||||
|
user_set_subst_flags = m.user_set_subst_flags;
|
||||||
|
user_set_add_libs = m.user_set_add_libs;
|
||||||
|
user_set_subst_libs = m.user_set_subst_libs;
|
||||||
|
user_set_compiler = m.user_set_compiler;
|
||||||
|
|
||||||
copyHelper(m);
|
copyHelper(m);
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -2317,7 +2328,7 @@ ModelTree::matlab_arch(const string &mexext)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ModelTree::compileDll(const string &basename, const string &static_or_dynamic, const string &mexext, const filesystem::path &matlabroot, const filesystem::path &dynareroot)
|
ModelTree::compileDll(const string &basename, const string &static_or_dynamic, const string &mexext, const filesystem::path &matlabroot, const filesystem::path &dynareroot) const
|
||||||
{
|
{
|
||||||
const string opt_flags = "-O3 -g0 --param ira-max-conflict-table-size=1 -fno-forward-propagate -fno-gcse -fno-dce -fno-dse -fno-tree-fre -fno-tree-pre -fno-tree-cselim -fno-tree-dse -fno-tree-dce -fno-tree-pta -fno-gcse-after-reload";
|
const string opt_flags = "-O3 -g0 --param ira-max-conflict-table-size=1 -fno-forward-propagate -fno-gcse -fno-dce -fno-dse -fno-tree-fre -fno-tree-pre -fno-tree-cselim -fno-tree-dse -fno-tree-dce -fno-tree-pta -fno-gcse-after-reload";
|
||||||
|
|
||||||
|
@ -2411,7 +2422,35 @@ ModelTree::compileDll(const string &basename, const string &static_or_dynamic, c
|
||||||
quotes to be correctly handled. See "cmd /?" for more details. */
|
quotes to be correctly handled. See "cmd /?" for more details. */
|
||||||
cmd << '"';
|
cmd << '"';
|
||||||
#endif
|
#endif
|
||||||
cmd << compiler << " " << opt_flags << " " << flags.str() << " " << main_src << " " << mex_src << " -o " << binary << " " << libs;
|
|
||||||
|
if (user_set_compiler.empty())
|
||||||
|
cmd << compiler << " ";
|
||||||
|
else
|
||||||
|
if (!filesystem::exists(user_set_compiler))
|
||||||
|
{
|
||||||
|
cerr << "Error: The specified compiler '" << user_set_compiler << "' cannot be found on your system" << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
cmd << user_set_compiler << " ";
|
||||||
|
|
||||||
|
if (user_set_subst_flags.empty())
|
||||||
|
cmd << opt_flags << " " << flags.str() << " ";
|
||||||
|
else
|
||||||
|
cmd << user_set_subst_flags << " ";
|
||||||
|
|
||||||
|
if (!user_set_add_flags.empty())
|
||||||
|
cmd << user_set_add_flags << " ";
|
||||||
|
|
||||||
|
cmd << main_src << " " << mex_src << " -o " << binary << " ";
|
||||||
|
|
||||||
|
if (user_set_subst_libs.empty())
|
||||||
|
cmd << libs;
|
||||||
|
else
|
||||||
|
cmd << user_set_subst_libs;
|
||||||
|
|
||||||
|
if (!user_set_add_libs.empty())
|
||||||
|
cmd << " " << user_set_add_libs;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
cmd << '"';
|
cmd << '"';
|
||||||
|
|
|
@ -64,6 +64,13 @@ class ModelTree : public DataTree
|
||||||
{
|
{
|
||||||
friend class DynamicModel;
|
friend class DynamicModel;
|
||||||
friend class StaticModel;
|
friend class StaticModel;
|
||||||
|
public:
|
||||||
|
// The following 5 variables are set via the `compiler` command
|
||||||
|
string user_set_add_flags;
|
||||||
|
string user_set_subst_flags;
|
||||||
|
string user_set_add_libs;
|
||||||
|
string user_set_subst_libs;
|
||||||
|
string user_set_compiler;
|
||||||
protected:
|
protected:
|
||||||
/*
|
/*
|
||||||
* ************** BEGIN **************
|
* ************** BEGIN **************
|
||||||
|
@ -324,7 +331,7 @@ private:
|
||||||
//! Returns the name of the MATLAB architecture given the extension used for MEX files
|
//! Returns the name of the MATLAB architecture given the extension used for MEX files
|
||||||
static string matlab_arch(const string &mexext);
|
static string matlab_arch(const string &mexext);
|
||||||
//! Compiles the MEX file
|
//! Compiles the MEX file
|
||||||
static void compileDll(const string &basename, const string &static_or_dynamic, const string &mexext, const filesystem::path &matlabroot, const filesystem::path &dynareroot);
|
void compileDll(const string &basename, const string &static_or_dynamic, const string &mexext, const filesystem::path &matlabroot, const filesystem::path &dynareroot) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ModelTree(SymbolTable &symbol_table_arg,
|
ModelTree(SymbolTable &symbol_table_arg,
|
||||||
|
|
|
@ -793,6 +793,36 @@ ParsingDriver::mfs(const string &value)
|
||||||
mod_file->static_model.mfs = val;
|
mod_file->static_model.mfs = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ParsingDriver::compilation_setup_substitute_flags(const string & flags)
|
||||||
|
{
|
||||||
|
mod_file->dynamic_model.user_set_subst_flags = flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ParsingDriver::compilation_setup_add_flags(const string & flags)
|
||||||
|
{
|
||||||
|
mod_file->dynamic_model.user_set_add_flags = flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ParsingDriver::compilation_setup_substitute_libs(const string & libs)
|
||||||
|
{
|
||||||
|
mod_file->dynamic_model.user_set_subst_libs = libs;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ParsingDriver::compilation_setup_add_libs(const string & libs)
|
||||||
|
{
|
||||||
|
mod_file->dynamic_model.user_set_add_libs = libs;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ParsingDriver::compilation_setup_compiler(const string & compiler)
|
||||||
|
{
|
||||||
|
mod_file->dynamic_model.user_set_compiler = compiler;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ParsingDriver::balanced_growth_test_tol(const string &value)
|
ParsingDriver::balanced_growth_test_tol(const string &value)
|
||||||
{
|
{
|
||||||
|
|
|
@ -358,6 +358,16 @@ public:
|
||||||
void cutoff(const string &value);
|
void cutoff(const string &value);
|
||||||
//! mfs option of model block
|
//! mfs option of model block
|
||||||
void mfs(const string &value);
|
void mfs(const string &value);
|
||||||
|
//! the flags to substitute for the default compiler flags used by `use_dll`
|
||||||
|
void compilation_setup_substitute_flags(const string & flags);
|
||||||
|
//! the flags to add to the default compiler flags used by `use_dll`
|
||||||
|
void compilation_setup_add_flags(const string & flags);
|
||||||
|
//! the libs to substitute for the default compiler libs used by `use_dll`
|
||||||
|
void compilation_setup_substitute_libs(const string & libs);
|
||||||
|
//! the libs to add to the default compiler libs used by `use_dll`
|
||||||
|
void compilation_setup_add_libs(const string & libs);
|
||||||
|
//! the compiler to replace the default compiler used by `use_dll`
|
||||||
|
void compilation_setup_compiler(const string & path);
|
||||||
//! balanced_growth_test_tol option of model block
|
//! balanced_growth_test_tol option of model block
|
||||||
void balanced_growth_test_tol(const string &value);
|
void balanced_growth_test_tol(const string &value);
|
||||||
//! Sets the FILENAME for the initial value in initval
|
//! Sets the FILENAME for the initial value in initval
|
||||||
|
|
|
@ -195,6 +195,12 @@ StaticModel::StaticModel(const DynamicModel &m) :
|
||||||
// Convert auxiliary equations
|
// Convert auxiliary equations
|
||||||
for (auto aux_eq : m.aux_equations)
|
for (auto aux_eq : m.aux_equations)
|
||||||
addAuxEquation(aux_eq->toStatic(*this));
|
addAuxEquation(aux_eq->toStatic(*this));
|
||||||
|
|
||||||
|
user_set_add_flags = m.user_set_add_flags;
|
||||||
|
user_set_subst_flags = m.user_set_subst_flags;
|
||||||
|
user_set_add_libs = m.user_set_add_libs;
|
||||||
|
user_set_subst_libs = m.user_set_subst_libs;
|
||||||
|
user_set_compiler = m.user_set_compiler;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in New Issue