![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Вот что происходит с альтеровским софтом Quartus II при попытке синтезировать простую схему асинхронного счётчика, содержащую LUTs с обратными связями.
Internal Error: Sub-system: CUT, File: /quartus/db/cut/cut_cuda_unateness.cpp, Line: 744
node->oterm_depends_on_iterm(oterm, data_c)
Stack Trace:
0x6f5fe0: CUT_UNATENESS_VISITOR::visit_atom_cuda_io_ibuf(CDB_ATOM_CUDA_IO_IBUF*) (db_cut)
0x6ed734: cut_get_unateness(CDB_ATOM_NODE*, DB_INPUT_PORT_TYPE, DB_OUTPUT_PORT_TYPE) + 0x114 (db_cut)
0x6b9f9: TDB_UNATENESS tdb_get_unateness_for_node>DB_INPUT_PORT_TYPE, DB_OUTPUT_PORT_TYPE>(CDB_ATOM_NODE*, DB_INPUT_PORT_TYPE, DB_OUTPUT_PORT_TYPE) + 0x9 (tsm_tdb)
0xabbcd: void set_or_add_delay_with_unateness>DB_INPUT_PORT_TYPE, DB_OUTPUT_PORT_TYPE>(TDB_EDGE*, DB_INPUT_PORT_TYPE, DB_OUTPUT_PORT_TYPE, CDB_ATOM_NODE*, int, bool) + 0x5d (tsm_a2t)
0xb480a: A2T_RECURSIVE_VISITOR::create_edge_without_recursion(CDB_ATOM_NODE*, TDB_NODE*, DB_INPUT_PORT_TYPE, DB_OUTPUT_PORT_TYPE, unsigned short) + 0x14a (tsm_a2t)
0x4d9fb: A2T_CUDA_VISITOR::visit_atom_cuda_lcell_comb(CDB_ATOM_CUDA_LCELL_COMB*, CDB_ATOM_OTERM*, TDB_EDGE*) + 0x18b (tsm_a2t)
0xc1e5a: A2T_RECURSIVE_VISITOR::visit_atom(CDB_ATOM_NODE*, CDB_ATOM_OTERM*, TDB_EDGE*) + 0x2c8a (tsm_a2t)
0xc2f80: A2T_RECURSIVE_VISITOR::set_arguments_and_process_oterm(CDB_ATOM_OTERM*) + 0x330 (tsm_a2t)
0xc5154: A2T_RECURSIVE_VISITOR::build_or_update_tdb_netlist_for_atoms(std::vector>CDB_ATOM_NODE*, std::allocator>CDB_ATOM_NODE*> >&, TDB_NETLIST_ATOM_DELETOR*) + 0x764 (tsm_a2t)
0xa8736: A2T_VISITOR::call_build_tdb_netlist_for_all_atoms() + 0x276 (tsm_a2t)
0xf3576: sta_build_nodes_from_atoms(CDB_ATOM_NETLIST*, CMP_FACADE*, TDB_NETLIST*) + 0xd6 (tsm_sta)
0x29a4a9: sta_build_and_preprocess_tdb(CMP_FACADE*, CDB_ATOM_NETLIST*, bool) + 0x169 (tsm_sta)
0x76068: TDC_STA_ACCESSORIES::initialize_netlist(CMP_FACADE*, CDB_ATOM_NETLIST*, TDC_DEFAULT_CONSTRAINTS const&, e_tdc_accessories_usage_mode, bool) + 0x248 (tsm_tdc)
0x15a951: FITCC_TDC_UTILITY::setup_tdc_utility(TAPI_DELAY_ANNOTATOR::INVOKE_MODE, std::vector>TDB_TIMING_MODEL, std::allocator>TDB_TIMING_MODEL> >, bool, bool, bool, bool, bool, bool, bool, QGL::FOREST>int, int>*, bool, bool) + 0x321 (fitter_fitcc)
0x15c989: FITCC_TDC_UTILITY::FITCC_TDC_UTILITY(FITCC_ENV const*, TAPI_DELAY_ANNOTATOR::INVOKE_MODE, std::vector>TDB_TIMING_MODEL, std::allocator>TDB_TIMING_MODEL> >, bool, bool, bool, bool, bool, bool, bool, QGL::FOREST>int, int>*, bool, bool) + 0x359 (fitter_fitcc)
0xa831c: FITCC_ENV::get_tdc_utility_or_create_if_necessary(FITCC_ENV::FITCC_TDC_UTILITY_REQUEST_TYPE, TAPI_DELAY_ANNOTATOR::INVOKE_MODE, std::vector>TDB_TIMING_MODEL, std::allocator>TDB_TIMING_MODEL> >, bool, bool, bool, bool, QGL::FOREST>int, int>*, bool) + 0xcac (fitter_fitcc)
0xa8960: FITCC_ENV::get_tdc_utility_or_create_if_necessary(FITCC_ENV::FITCC_TDC_UTILITY_REQUEST_TYPE, TAPI_DELAY_ANNOTATOR::INVOKE_MODE, dat_timing_models, bool, bool, bool, bool, QGL::FOREST>int, int>*, bool) + 0x1f0 (fitter_fitcc)
0x3c06a4: FSAC_RP_UTIL_BODY::refresh_clock_atom_ids() + 0x164 (fitter_fsac)
0x3c0d31: FSAC_RP_UTIL::sweep_inverters_and_wire_luts_at_packable_boundaries() + 0x11 (fitter_fsac)
0x282da: FCUDA_EXPERT::fitter_preparation() const + 0x2d3c (fitter_fcuda)
0xba8ba: FITCC_EXPERT::fitter_preparation() const + 0x13a (fitter_fitcc)
0xbce98: FITCC_EXPERT::invoke_fitter() const + 0x5e8 (fitter_fitcc)
0x21c9a: fcuda_execute + 0x18e (fitter_fcuda)
0x2457e: fmain_start(CMP_FACADE*) + 0x4ae (fitter_fmain)
0x1f826: qfit_execute_fit(QCU_FRAMEWORK*, QFIT_FRAMEWORK*) + 0x1d6 (comp_qfit_legacy_flow)
0x1bda2: QFIT_FRAMEWORK::execute() + 0x282 (comp_qfit_legacy_flow)
0x23568: qfit_legacy_flow_run_legacy_fitter_flow + 0x218 (comp_qfit_legacy_flow)
0x4d671: TclInvokeStringCommand + 0x81 (tcl8.6)
0x51ec7: TclNRRunCallbacks + 0x47 (tcl8.6)
0x536e7: TclEvalEx + 0x947 (tcl8.6)
0xfb366: Tcl_FSEvalFileEx + 0x266 (tcl8.6)
0xfb47e: Tcl_EvalFile + 0x2e (tcl8.6)
0x11ebc: qexe_evaluate_tcl_script(std::string const&) + 0x382 (comp_qexe)
0x18dcf: qexe_do_tcl(QEXE_FRAMEWORK*, std::string const&, std::string const&, std::list>std::string, std::allocator>std::string> > const&, bool, bool) + 0x597 (comp_qexe)
0x19d7b: qexe_run_tcl_option(QEXE_FRAMEWORK*, char const*, std::list>std::string, std::allocator>std::string> >*, bool) + 0x57e (comp_qexe)
0x3e06a: qcu_run_tcl_option(QCU_FRAMEWORK*, char const*, std::list>std::string, std::allocator>std::string> >*, bool) + 0x1065 (comp_qcu)
0x1c586: qexe_standard_main(QEXE_FRAMEWORK*, QEXE_OPTION_DEFINITION const**, int, char const**) + 0x6b3 (comp_qexe)
0x3b75: qfit2_main(int, char const**) + 0xc5 (quartus_fit)
0x407e0: msg_main_thread(void*) + 0x10 (ccl_msg)
0x602c: thr_final_wrapper + 0xc (ccl_thr)
0x4089f: msg_thread_wrapper(void* (*)(void*), void*) + 0x62 (ccl_msg)
0xa559: mem_thread_wrapper(void* (*)(void*), void*) + 0x99 (ccl_mem)
0x8f92: err_thread_wrapper(void* (*)(void*), void*) + 0x27 (ccl_err)
0x63f2: thr_thread_wrapper + 0x15 (ccl_thr)
0x42c37: msg_exe_main(int, char const**, int (*)(int, char const**)) + 0xa3 (ccl_msg)
0x203f1: __libc_start_main + 0xf1 (c.so.6)
End-trace
Это если поставить для таких ячеек параметр dont_touch="yes", иначе квартус их просто тихо выкидывает из схемы.
Internal Error: Sub-system: CUT, File: /quartus/db/cut/cut_cuda_unateness.cpp, Line: 744
node->oterm_depends_on_iterm(oterm, data_c)
Stack Trace:
0x6f5fe0: CUT_UNATENESS_VISITOR::visit_atom_cuda_io_ibuf(CDB_ATOM_CUDA_IO_IBUF*) (db_cut)
0x6ed734: cut_get_unateness(CDB_ATOM_NODE*, DB_INPUT_PORT_TYPE, DB_OUTPUT_PORT_TYPE) + 0x114 (db_cut)
0x6b9f9: TDB_UNATENESS tdb_get_unateness_for_node>DB_INPUT_PORT_TYPE, DB_OUTPUT_PORT_TYPE>(CDB_ATOM_NODE*, DB_INPUT_PORT_TYPE, DB_OUTPUT_PORT_TYPE) + 0x9 (tsm_tdb)
0xabbcd: void set_or_add_delay_with_unateness>DB_INPUT_PORT_TYPE, DB_OUTPUT_PORT_TYPE>(TDB_EDGE*, DB_INPUT_PORT_TYPE, DB_OUTPUT_PORT_TYPE, CDB_ATOM_NODE*, int, bool) + 0x5d (tsm_a2t)
0xb480a: A2T_RECURSIVE_VISITOR::create_edge_without_recursion(CDB_ATOM_NODE*, TDB_NODE*, DB_INPUT_PORT_TYPE, DB_OUTPUT_PORT_TYPE, unsigned short) + 0x14a (tsm_a2t)
0x4d9fb: A2T_CUDA_VISITOR::visit_atom_cuda_lcell_comb(CDB_ATOM_CUDA_LCELL_COMB*, CDB_ATOM_OTERM*, TDB_EDGE*) + 0x18b (tsm_a2t)
0xc1e5a: A2T_RECURSIVE_VISITOR::visit_atom(CDB_ATOM_NODE*, CDB_ATOM_OTERM*, TDB_EDGE*) + 0x2c8a (tsm_a2t)
0xc2f80: A2T_RECURSIVE_VISITOR::set_arguments_and_process_oterm(CDB_ATOM_OTERM*) + 0x330 (tsm_a2t)
0xc5154: A2T_RECURSIVE_VISITOR::build_or_update_tdb_netlist_for_atoms(std::vector>CDB_ATOM_NODE*, std::allocator>CDB_ATOM_NODE*> >&, TDB_NETLIST_ATOM_DELETOR*) + 0x764 (tsm_a2t)
0xa8736: A2T_VISITOR::call_build_tdb_netlist_for_all_atoms() + 0x276 (tsm_a2t)
0xf3576: sta_build_nodes_from_atoms(CDB_ATOM_NETLIST*, CMP_FACADE*, TDB_NETLIST*) + 0xd6 (tsm_sta)
0x29a4a9: sta_build_and_preprocess_tdb(CMP_FACADE*, CDB_ATOM_NETLIST*, bool) + 0x169 (tsm_sta)
0x76068: TDC_STA_ACCESSORIES::initialize_netlist(CMP_FACADE*, CDB_ATOM_NETLIST*, TDC_DEFAULT_CONSTRAINTS const&, e_tdc_accessories_usage_mode, bool) + 0x248 (tsm_tdc)
0x15a951: FITCC_TDC_UTILITY::setup_tdc_utility(TAPI_DELAY_ANNOTATOR::INVOKE_MODE, std::vector>TDB_TIMING_MODEL, std::allocator>TDB_TIMING_MODEL> >, bool, bool, bool, bool, bool, bool, bool, QGL::FOREST>int, int>*, bool, bool) + 0x321 (fitter_fitcc)
0x15c989: FITCC_TDC_UTILITY::FITCC_TDC_UTILITY(FITCC_ENV const*, TAPI_DELAY_ANNOTATOR::INVOKE_MODE, std::vector>TDB_TIMING_MODEL, std::allocator>TDB_TIMING_MODEL> >, bool, bool, bool, bool, bool, bool, bool, QGL::FOREST>int, int>*, bool, bool) + 0x359 (fitter_fitcc)
0xa831c: FITCC_ENV::get_tdc_utility_or_create_if_necessary(FITCC_ENV::FITCC_TDC_UTILITY_REQUEST_TYPE, TAPI_DELAY_ANNOTATOR::INVOKE_MODE, std::vector>TDB_TIMING_MODEL, std::allocator>TDB_TIMING_MODEL> >, bool, bool, bool, bool, QGL::FOREST>int, int>*, bool) + 0xcac (fitter_fitcc)
0xa8960: FITCC_ENV::get_tdc_utility_or_create_if_necessary(FITCC_ENV::FITCC_TDC_UTILITY_REQUEST_TYPE, TAPI_DELAY_ANNOTATOR::INVOKE_MODE, dat_timing_models, bool, bool, bool, bool, QGL::FOREST>int, int>*, bool) + 0x1f0 (fitter_fitcc)
0x3c06a4: FSAC_RP_UTIL_BODY::refresh_clock_atom_ids() + 0x164 (fitter_fsac)
0x3c0d31: FSAC_RP_UTIL::sweep_inverters_and_wire_luts_at_packable_boundaries() + 0x11 (fitter_fsac)
0x282da: FCUDA_EXPERT::fitter_preparation() const + 0x2d3c (fitter_fcuda)
0xba8ba: FITCC_EXPERT::fitter_preparation() const + 0x13a (fitter_fitcc)
0xbce98: FITCC_EXPERT::invoke_fitter() const + 0x5e8 (fitter_fitcc)
0x21c9a: fcuda_execute + 0x18e (fitter_fcuda)
0x2457e: fmain_start(CMP_FACADE*) + 0x4ae (fitter_fmain)
0x1f826: qfit_execute_fit(QCU_FRAMEWORK*, QFIT_FRAMEWORK*) + 0x1d6 (comp_qfit_legacy_flow)
0x1bda2: QFIT_FRAMEWORK::execute() + 0x282 (comp_qfit_legacy_flow)
0x23568: qfit_legacy_flow_run_legacy_fitter_flow + 0x218 (comp_qfit_legacy_flow)
0x4d671: TclInvokeStringCommand + 0x81 (tcl8.6)
0x51ec7: TclNRRunCallbacks + 0x47 (tcl8.6)
0x536e7: TclEvalEx + 0x947 (tcl8.6)
0xfb366: Tcl_FSEvalFileEx + 0x266 (tcl8.6)
0xfb47e: Tcl_EvalFile + 0x2e (tcl8.6)
0x11ebc: qexe_evaluate_tcl_script(std::string const&) + 0x382 (comp_qexe)
0x18dcf: qexe_do_tcl(QEXE_FRAMEWORK*, std::string const&, std::string const&, std::list>std::string, std::allocator>std::string> > const&, bool, bool) + 0x597 (comp_qexe)
0x19d7b: qexe_run_tcl_option(QEXE_FRAMEWORK*, char const*, std::list>std::string, std::allocator>std::string> >*, bool) + 0x57e (comp_qexe)
0x3e06a: qcu_run_tcl_option(QCU_FRAMEWORK*, char const*, std::list>std::string, std::allocator>std::string> >*, bool) + 0x1065 (comp_qcu)
0x1c586: qexe_standard_main(QEXE_FRAMEWORK*, QEXE_OPTION_DEFINITION const**, int, char const**) + 0x6b3 (comp_qexe)
0x3b75: qfit2_main(int, char const**) + 0xc5 (quartus_fit)
0x407e0: msg_main_thread(void*) + 0x10 (ccl_msg)
0x602c: thr_final_wrapper + 0xc (ccl_thr)
0x4089f: msg_thread_wrapper(void* (*)(void*), void*) + 0x62 (ccl_msg)
0xa559: mem_thread_wrapper(void* (*)(void*), void*) + 0x99 (ccl_mem)
0x8f92: err_thread_wrapper(void* (*)(void*), void*) + 0x27 (ccl_err)
0x63f2: thr_thread_wrapper + 0x15 (ccl_thr)
0x42c37: msg_exe_main(int, char const**, int (*)(int, char const**)) + 0xa3 (ccl_msg)
0x203f1: __libc_start_main + 0xf1 (c.so.6)
End-trace
Это если поставить для таких ячеек параметр dont_touch="yes", иначе квартус их просто тихо выкидывает из схемы.